подстановка sed переменными bash - PullRequest
49 голосов
/ 07 октября 2011

Попытка изменить значения в текстовом файле, используя sed в bash-скрипте со строкой,

sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp

Это будет в цикле for. Не уверен, почему это не работает. Есть предложения?

Ответы [ 4 ]

65 голосов
/ 07 октября 2011

Переменные внутри ' не заменяются в bash.Чтобы получить подстановку строк (или интерполяцию, если вы знакомы с Perl), вам нужно изменить ее на использование двойных кавычек " вместо одинарных кавычек:

$ # enclose entire expression in double quotes
$ sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp

$ # or, concatenate strings with only variables inside double quotes
$ # this would restrict expansion to relevant portion
$ # and prevent accidental expansion for !, backticks, etc
$ sed 's/draw('"$prev_number"';n_)/draw('"$number"';n_)/g' file.txt > tmp

$ # variable cannot contain arbitrary characters
$ # see link in further reading section for details
$ a='foo 
bar'
$ echo 'baz' | sed 's/baz/'"$a"'/g'
sed: -e expression #1, char 9: unterminated `s' command


Дополнительная литература:

13 голосов
/ 07 октября 2011

переменные в одинарных кавычках не раскрываются, в двойных кавычках они используются в этом случае в двойных кавычках.

sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp

Вы также можете заставить его работать с eval, но не делайте этого !!

5 голосов
/ 07 октября 2011
sed "s/draw($prev_number;n_)/draw($number;n_)/g" 

это будет работать?

1 голос
/ 16 июня 2016

Вы можете использовать переменные, как показано ниже. Как и здесь, я хотел заменить hostname, т. Е. Системную переменную в файле. Я ищу строку look.me и заменяю эту строку на look.me=<system_name>

sed -i "s/.*look.me.*/look.me=`hostname`/"

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

host_var= `hostname`

sed -i "s/.*look.me.*/look.me=$host_var/"


Входной файл:

look.me=demonic

Вывод файла (при условии, что мое системное имя prod-cfm-frontend-1-usa-central-1):

look.me=prod-cfm-frontend-1-usa-central-1
...