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

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

var1=QQsed -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):

-is,bert,Say hurrah to &: \0/,text.txt

Если file.txt содержит bert, результат будет:

Say hurrah to bert: \0/

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

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

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

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

Чтобы расширить (каламбур) на ответ @мани,

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

смотрите мой ответ в этом вашем посте

связанные: Escape a string for a sed replace pattern - Stack Overflow