Подтвердить что ты не робот

Переменные оболочки в сценарии sed

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

new_db_name=${new_db_name/$replace_string/$replace_with}

Ответ 3

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

export a=foo
export b=bar

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

bar/b

Ответ 4

Ребята: я использовал следующее, чтобы передать переменные bash в функцию в bash script с помощью sed. I.e., я передал переменные 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

С уважением!

Ответ 5

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

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 в качестве переменной, backticks больше не рекомендуется. Захват вывода окружен $().

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 expresion $replace_with не будет работать. bash не имеет достаточного контекста, чтобы избежать выражения переменной. ${replace_with} сообщает bash явно использовать содержимое команды, выданной переменной.

Ответ 6

me funciono asi desde la shell

            x1="->"
            x2="xxxxxxxxxxxxxxx"

            sed -i s/$x1/$x2/g "file.txt"