SED замена для переменной - PullRequest
       11

SED замена для переменной

0 голосов
/ 14 сентября 2010

У меня есть файл с именем check.txt, который имеет следующее содержимое:

$ cat check.txt
~/bin/tibemsadmin -server $URL-user $USER -password $PASWRD
$

У меня есть основной скрипт, в котором значения $ URL, $ USER, $ PASWRD получены из основного скрипта.Я хочу использовать утилиту SED, чтобы заменить $ URL, $ USER, $ PASWRD фактическими значениями в файле check.txt.

Я пытаюсь вот так, но не получается.

emsurl=tcp://myserver:3243
emsuser=test
emspasswd=new
sed s/$URL/${emsurl}/g check.txt >> check_new.txt
sed s/$USER/${emsuser}/g check.txt_new.txt >> check_new_1.txt
sed s/PASWRD/${emspasswd}/g check_new_1.txt >> final.txt

Мой вывод final.txt необходим, как показано ниже:

~/bin/tibemsadmin -server tcp://myserver:3243 -user test -password new

Не могли бы вы мне помочь?

Ответы [ 4 ]

3 голосов
/ 14 сентября 2010

Вы должны быть довольно осторожны с использованием цитат.Вам также необходимо научиться выполнять несколько операций за один проход и / или использовать каналы.

emsurl=tcp://myserver:3243
emsuser=test
emspasswd=new
sed -e "s%\$URL%${emsurl}%g" \
    -e "s%\$USER%${emsuser}%g" \
    -e "s%\$PASWRD%${emspasswd}%g" check.txt >final.txt

Ваша проблема в том, что оболочка расширила '$ URL' в командной строке (возможно,ничего), что означает, что sed должен увидеть что-то другое, чем вы хотели.Если экранировать $ с помощью \, sed увидит, что вы хотели.

Обратите внимание, что я изначально использовал / в качестве разделителя в операциях замены;однако, как справедливо указывает DarkDust , это не будет работать, поскольку в URL-адресах есть косые черты.Мой обычный резервный символ - % - как сейчас показано - но он может появляться в некоторых URL-адресах и может не подходить.Я бы, вероятно, использовал контрольный символ, такой как control-A, если бы мне пришлось беспокоиться об этом - или я бы использовал Perl, который мог бы играть без запутывания.

Вы также можете комбинироватьтри отдельных -e выражения в одно с заменой их точкой с запятой.Однако я предпочитаю четкость трех операций, четко разделенных.

2 голосов
/ 14 сентября 2010

Вы можете использовать немного другой подход, изменив ваш основной скрипт следующим образом: -

export URL="tcp://myserver:3243"
export USER=test
export PASWRD=new
. ./check.txt

Это устанавливает переменные и затем запускает check.txt в контексте вашего основного скрипта

1 голос
/ 14 сентября 2010

Хотя вы не говорите, что не получается, я думаю, я вижу проблемы.

Я предлагаю вам сделать это:

sed "s|\$URL|${emsurl}|g"

То есть, первое $ должно бытьсбежал, потому что вы хотите буквально.Затем вместо / я предлагаю вам использовать | (pipe) в качестве разделителя, поскольку он не используется в ваших строках.Наконец, используйте ", чтобы убедиться, что содержимое интерпретируется оболочкой как строка.

После этого вы можете передать все вместе, чтобы не нуждаться во временных файлах:

sed "s|\$URL|${emsurl}|g" | sed "s|\$USER|${emsuser}|g" | sed "s|\$PASSWRD|${emspasswd}|g"
0 голосов
/ 13 января 2015

Подстановка переменной должна быть вне выражения sed, а '$' должно быть экранировано;в вашем случае что-то вроде этого:

sed -e 's/\$URL/'$emsurl'/g' -e 's/\$USER/'$emsuser'/g' -e 's/\$PASSWORD/'$emaspasswd'/g'

В любом случае, на вашем месте я бы не стал использовать $ для сопоставления заполнителей в файле шаблона, поскольку это вызывает путаницу с переменными BASH, вместо этого используйте другой шаблон (например, @URL @).

...