Я попытался следующий код , чтобы заменить QQ
с ZZ
, но он не делает то , что я хочу:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
Тем не менее, этот код делает то, что я хочу:
sed -i 's/QQ/ZZ/g' $file
Как использовать переменные в sed
?
Я попытался следующий код , чтобы заменить QQ
с ZZ
, но он не делает то , что я хочу:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
Тем не менее, этот код делает то, что я хочу:
sed -i 's/QQ/ZZ/g' $file
Как использовать переменные в 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,replacement,
вместо s/pattern/replacement/
, я сделал это, чтобы избежать вмешательства /
в \0/
.
Затем оболочка выполняет указанную выше команду sed
со следующими аргументами (при условии pattern=bert
и file=text.txt
):
-i
s,bert,Say hurrah to &: \0/,
text.txt
Если file.txt
содержится bert
, вывод будет:
Say hurrah to bert: \0/
g
вариант, поэтому вы должны пройти s,foo,bar,g
вместо этого.
\\0
вместо \0
, это не должно быть сделано, когда \0
заключено в одинарные кавычки. В противном случае sed
шаблон будет заменен литералом \0
вместо всего совпадения.
Мы можем использовать переменные в sed
двойных кавычках:
sed -i "s/$var/r_str/g" file_name
Если /
в переменной есть косая черта, используйте другой разделитель, как показано ниже:
sed -i "s|$var|r_str|g" file_name
/
в переменной => Это спасло меня! Моя переменная является URL-адресом, и он содержит /
. Переключение на использование в |
качестве разделителя исправило мою проблему