Як я можу використовувати змінні в команді sed?


266

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

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

Однак цей код робить те, що я хочу:

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

Як я можу використовувати змінні sed?



Відповіді:


358

Оболонка відповідає за розширення змінних. Якщо ви використовуєте одиничні лапки для рядків, її вміст буде оброблятися буквально, тому 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/

2
Як можна пропустити параметр "/ g", використовуючи цю відокремлену комою форму?
блон

6
@ b.long Це gваріант, тому ви переходите s,foo,bar,gзамість цього.
Лекенштейн

1
ваш єдиний приклад цитати, особливо корисний, охоплює sed, використовуючи схему регулярного виразів!
Брайан Томас

У випадку, якщо вас спокушає використовувати \\0замість цього \0, це робити не повинно, коли \0він укладений в єдині лапки. Інакше sedзамінить шаблон на буквальний, \0а не на весь матч.
Лекенштейн

Зробив трюк для мене.
jimh

114

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

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

Якщо ви маєте косу рису /змінної, використовуйте інший роздільник, як показано нижче:

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

7
Якщо у вас є похила /в змінній => Це врятувало мене! Моя змінна URL-адреса, і вона містить /. Перехід на використання |як сепаратор
вирішив

Великий палець вгору за "якщо у вас є коса риса в змінній"
Tiina
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.