Я попытался следующий код , чтобы заменить QQ
с ZZ
, но он не делает то , что я хочу:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
Тем не менее, этот код делает то, что я хочу:
sed -i 's/QQ/ZZ/g' $file
Как использовать переменные в sed
?
command-line
bash
sed
UAdapter
источник
источник
Ответы:
Оболочка отвечает за расширение переменных. Когда вы используете одинарные кавычки для строк, их содержимое будет обрабатываться буквально, поэтому
sed
теперь пытается заменить каждое вхождение литерала$var1
наZZ
.Использование двойных кавычек
Используйте двойные кавычки, чтобы оболочка расширяла переменные, сохраняя пробелы:
Когда вам требуется символ кавычки в строке замены, вам нужно поставить перед ним обратную косую черту, которая будет интерпретироваться оболочкой. В следующем примере строка
quote me
будет заменена на"quote me"
(символ&
интерпретируется какsed
):Использование одинарных кавычек
Если у вас много метасимволов оболочки, попробуйте использовать одинарные кавычки для шаблона и двойные кавычки для переменной:
Обратите внимание, как я использую
s,pattern,replacement,
вместоs/pattern/replacement/
, я сделал это, чтобы избежать вмешательства/
в\0/
.пример
Затем оболочка выполняет указанную выше команду
sed
со следующими аргументами (при условииpattern=bert
иfile=text.txt
):Если
file.txt
содержитсяbert
, вывод будет:источник
g
вариант, поэтому вы должны пройтиs,foo,bar,g
вместо этого.\\0
вместо\0
, это не должно быть сделано, когда\0
заключено в одинарные кавычки. В противном случаеsed
шаблон будет заменен литералом\0
вместо всего совпадения.Мы можем использовать переменные в
sed
двойных кавычках:Если
/
в переменной есть косая черта, используйте другой разделитель, как показано ниже:источник
/
в переменной => Это спасло меня! Моя переменная является URL-адресом, и он содержит/
. Переключение на использование в|
качестве разделителя исправило мою проблему