sed с переменными bash

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

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

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

    Переменные внутри ' не заменяются в 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
    • Возможно ли избежать метасимволов регулярных выражений с помощью sed
    • Использование разных разделителей для команды sed substitute
    • Если вам это не нужно в другом файле, вы можете использовать флаг -i, чтобы изменить файл на месте

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

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

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

     sed "s/draw($prev_number;n_)/draw($number;n_)/g" 

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

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

     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 
    Давайте будем гением компьютера.