Sed с переменными bash
Попытка изменить значения в текстовом файле с помощью sed в bash script с помощью строки,
sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp
Это будет в цикле for. Не уверен, почему он не работает. Любые предложения?
Ответы
Ответ 1
Переменные внутри '
не заменяются в bash. Чтобы получить подстановку строк (или интерполяцию, если вы знакомы с perl), вам нужно будет изменить ее, чтобы использовать двойные кавычки "
вместо одиночных кавычек:
sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp
Кроме того, если вам это не нужно в другом файле, вы можете использовать флаг -i
, чтобы изменить файл на месте.
Ответ 2
переменные в одинарных кавычках не расширяются, в двойных кавычках они используют двойные кавычки в этом случае.
sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp
Вы также можете заставить его работать с eval
, но не делайте этого!!
Ответ 3
sed "s/draw($prev_number;n_)/draw($number;n_)/g"
будет ли это работать?
Ответ 4
Вы можете использовать переменные, как показано ниже. Как здесь, я хотел заменить 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