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