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

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

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

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

[ 111]

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

436
задан 14 March 2017 в 06:01

3 ответа

Оболочка отвечает за раскрытие переменных. Когда вы используете одинарные кавычки для строк, их содержимое будет обрабатываться буквально, поэтому 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/
524
ответ дан 14 March 2017 в 06:01

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

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

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

sed -i "s|$var|r_str|g" file_name
163
ответ дан 14 March 2017 в 06:01

Чтобы раскрыть (каламбур) @mani answer ,

  • , это решение будет работать для регулярных выражений, передаваемых другим командам, например perl
  • ] используйте двойные кавычки вокруг регулярного выражения (да, даже в системах Unixy) в чтобы расширить переменную, как ожидалось,
  • | также может появиться в значении вашей переменной, поэтому не бойтесь пробовать другие разделители
0
ответ дан 5 January 2021 в 23:48

Другие вопросы по тегам:

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