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

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

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

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

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

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

171 голос | спросил UAdapter 7 12011vEurope/Moscow11bEurope/MoscowMon, 07 Nov 2011 20:30:50 +0400 2011, 20:30:50

2 ответа


246

Оболочка отвечает за расширение переменных. Когда вы используете одинарные кавычки для строк, его содержимое будет обрабатываться буквально, поэтому 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 7 12011vEurope/Moscow11bEurope/MoscowMon, 07 Nov 2011 21:20:52 +0400 2011, 21:20:52
77

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

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

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

sed -i "s|$var|r_str|g" file_name
ответил mani 7 PM00000070000003431 2014, 19:29:34

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132