Как использовать переменные в команде sed?

266

Я попытался следующий код , чтобы заменить QQс ZZ, но он не делает то , что я хочу:

var1=QQ
sed -i 's/$var1/ZZ/g' $file

Тем не менее, этот код делает то, что я хочу:

sed -i 's/QQ/ZZ/g' $file

Как использовать переменные в sed?

UAdapter
источник
связанные: stackoverflow.com/questions/407523/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

359

Оболочка отвечает за расширение переменных. Когда вы используете одинарные кавычки для строк, их содержимое будет обрабатываться буквально, поэтому 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/
Lekensteyn
источник
2
Как можно передать параметр "/ g", используя эту разделенную запятыми форму?
Блонг
6
@ b.long Это gвариант, поэтому вы должны пройти s,foo,bar,gвместо этого.
Лекенштейн
1
Ваш пример с одинарной кавычкой особенно полезен, он довольно хорошо охватывает sed с использованием регулярных выражений!
Брайан Томас
В случае, если вы склонны использовать \\0вместо \0, это не должно быть сделано, когда \0заключено в одинарные кавычки. В противном случае sedшаблон будет заменен литералом \0вместо всего совпадения.
Лекенштейн
Сделал трюк для меня.
Джим
114

Мы можем использовать переменные в sedдвойных кавычках:

sed -i "s/$var/r_str/g" file_name

Если /в переменной есть косая черта, используйте другой разделитель, как показано ниже:

sed -i "s|$var|r_str|g" file_name
мани
источник
7
Если у вас есть косая черта /в переменной => Это спасло меня! Моя переменная является URL-адресом, и он содержит /. Переключение на использование в |качестве разделителя исправило мою проблему
sonlexqt
Большой палец вверх для «если у вас есть косая черта в переменной»
Тийна