замена sed переменными bash
попытка изменить значения в текстовом файле с помощью sed в скрипте bash со строкой,
sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp
Это будет в цикле for. Не уверен, почему это не работает. Есть предложения?
4 ответов
переменные внутри '
не подставляйтесь в 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
Читайте Далее:
- разница между одинарными и двойными кавычками в Bash
- можно ли избежать метасимволов regex надежно с СЭД
- использование различных разделителей для команды замены sed
- Если вам это не нужно в другом файле, вы можете использовать -я флаг, чтобы изменить файл на месте
переменные в одинарных кавычках не расширяются, в двойных кавычках они есть, в этом случае используйте двойные кавычки.
sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp
вы также можете заставить его работать с eval
, но не делают этого!!
вы можете использовать переменные, как показано ниже. Как здесь, я хотел заменить hostname
ie, системная переменная в файле. Я ищу string 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