Я попытался следующий код , чтобы заменить 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-адресом, и он содержит /. Переключение на использование в |качестве разделителя исправило мою проблему