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


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

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

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

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

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


179
2017-11-07 16:30


происхождения


видеть мой ответ на этом посту - ata
Связанный: stackoverflow.com/questions/407523/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


ответы:


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

253
2017-11-07 17:20



Как передать параметр «/ g», используя эту форму, разделенную запятой? - blong
@ b.long Это g вариант, поэтому вы пройдете s,foo,bar,g вместо. - Lekensteyn
особенно полезен один пример кавычек, который отлично сочетает использование шаблона регулярных выражений! - Brian Thomas
В случае, если у вас возникает соблазн использовать \\0 вместо \0, это не должно быть сделано, если \0 заключен в одинарные кавычки. В противном случае sed заменит шаблон для литерала \0 а не весь матч. - Lekensteyn


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

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

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

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

79
2017-08-07 15:29