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

189

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

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

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

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

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

    
задан UAdapter 07.11.2011 в 16:30
источник

2 ответа

263

Оболочка отвечает за расширение переменных. Когда вы используете одиночные кавычки для строк, его содержимое будет обрабатываться буквально, поэтому 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 &: 
-i
s,bert,Say hurrah to &: 
Say hurrah to bert: %pr_e%/
/, text.txt
/,' "$file"

Обратите внимание, как я использую s,pattern,replacement, вместо s/pattern/replacement/ , я сделал это, чтобы избежать помех / в sed/ .

Пример

Затем оболочка запускает указанную выше команду pattern=bert со следующими аргументами (предполагая file=text.txt и file.txt ):

%pr_e%

Если bert содержит %co_de% , выход будет:

%pr_e%     
ответ дан Lekensteyn 07.11.2011 в 17:20
источник
83

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

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

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

sed -i "s|$var|r_str|g" file_name
    
ответ дан mani 07.08.2014 в 15:29

Ознакомьтесь с другими вопросами по меткам