Я попробовал следующий код, чтобы заменить QQ
на ZZ
, но он не выполняет то, что я хочу:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
Однако этот код делает то, что я хочу:
[ 111] Как использовать переменные в sed
?
Оболочка отвечает за раскрытие переменных. Когда вы используете одинарные кавычки для строк, их содержимое будет обрабатываться буквально, поэтому sed
теперь пытается заменить каждое вхождение литерала $ var1
на ZZ
.
Используйте двойные кавычки, чтобы оболочка расширяла переменные с сохранением пробелов:
sed -i "s/$var1/ZZ/g" "$file"
Когда вам требуется символ кавычки в строке замены, вы должны поставить перед ним обратную косую черту, которая будет интерпретироваться оболочкой . В следующем примере строка quote me
будет заменена на "quote me"
(символ &
интерпретируется sed
) :
sed -i "s/quote me/\"&\"/" "$file"
Если у вас много метасимволов оболочки, подумайте об использовании одинарных кавычек для шаблона и двойных кавычек для переменной:
sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"
Обратите внимание, как я использую s, pattern, replace,
вместо s / pattern / replace /
, я сделал это, чтобы не мешать /
в \ 0 /
.
Затем оболочка запускает указанную выше команду sed
со следующими аргументами (при условии, что шаблон = bert
и файл = text.txt
):
-i
s,bert,Say hurrah to &: \0/,
text.txt
Если file.txt
содержит bert
, вывод будет:
Say hurrah to bert: \0/
Мы можем использовать переменные в sed
, используя двойные кавычки:
sed -i "s/$var/r_str/g" file_name
Если у вас есть косая черта /
в переменной, используйте другой разделитель, например ниже:
sed -i "s|$var|r_str|g" file_name
Чтобы раскрыть (каламбур) @mani answer ,
perl
|
также может появиться в значении вашей переменной, поэтому не бойтесь пробовать другие разделители