Я попробовал следующий код для замены QQ
с ZZ
, но это не делает того, чего я хочу:
var1=QQsed -i 's/$var1/ZZ/g' $file
Однако этот код делает то, что я хочу:
sed -i 's/QQ/ZZ/g' $file
Как мне использовать переменные в 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
|
может появиться и в значении вашей переменной, так что не бойтесь пробовать другие разделителисмотрите мой ответ в этом вашем посте