Переменные оболочки в сценарии sed - PullRequest
17 голосов
/ 10 августа 2011

Команда sed работает должным образом в командной строке, но не работает в сценарии оболочки.

new_db_name=`echo "$new_db_name" | sed 's/$replace_string/$replace_with/'`

Почему это так и как я могу это исправить?

Ответы [ 5 ]

48 голосов
/ 10 августа 2011

Используйте двойные кавычки для выражения sed.

new_db_name=`echo "$new_db_name" | sed "s/$replace_string/$replace_with/"`
5 голосов
/ 10 августа 2011

Если вы используете bash, это должно работать:

new_db_name=${new_db_name/$replace_string/$replace_with}
4 голосов
/ 05 марта 2014

Это помогло мне использовать аргументы env.

export a=foo
export b=bar

echo a/b | sed 's/a/'$b'/'

bar/b
1 голос
/ 29 сентября 2016

Ребята: я использовал следующее для передачи переменных bash в функцию в сценарии bash с использованием sed. Т.е. я передал переменные bash команде sed.

#!/bin/bash                            
function solveOffendingKey(){

    echo "We will delete the offending key in file: $2, in line: $1"
    sleep 5
    eval "sed -i '$1d' $2"
}


line='4'
file=~/ivan/known_hosts
solveOffendingKey $number $file

С уважением!

0 голосов
/ 23 декабря 2015

в зависимости от того, как инициализируются ваши переменные, лучше использовать скобки:

new_db_name=`echo "$new_db_name" | sed "s/${replace_string}`/${replace_with}/"

Может быть, я что-то упускаю, но new_db_name=echo "$new_db_name" здесь не имеет смысла. $ new_db_name пусто, поэтому вы выводите нулевой результат, а затем вывод команды sed. Чтобы захватить stdout как переменную, обратные пометки больше не рекомендуются. Захват вывода в окружении $().

new_db_name=$(sed "s/${replace_string}/${replace_with}/")

Возьмите следующий пример:

replace_string="replace_me"
replace_with=$(cat replace_file.txt | grep "replacement_line:" | awk FS" '{print $1}')

Где replace_file.txt может выглядеть примерно так:

old_string: something_old
I like cats
replacement_line: "shiny_new_db"

Просто наличие переменной в выражении sed $replace_with не сработает. У bash недостаточно контекста, чтобы избежать выражения переменной. ${replace_with} указывает bash явно использовать содержимое команды, выданной переменной.

...