використання sed з ampersand (&)


19

Я використовую sed для пошуку та заміни шаблонів у файлах SAS, а не замінюю їх окремо. Проблема полягає в тому, що я намагаюся замінити макрозмінні, і коли я використовую ampersand він не обробляється правильно.

Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas

кожного разу, коли я запускаю цю команду, вона здається, що вона додається і виконує всілякі фанкі з оригінальним текстом.

Питання: Як замінити текст, що містить амперсанди, командою sed?


6
&є спеціальним символом, тому його 's/user=&uid./user=\&sysuserid./g'потрібно уникати при використанні в RHS - у вашому випадку вам доведеться бігти, хоча я підозрюю, що вам також потрібно втекти крапкою в LHS, щоб відповідати буквальній крапці, тому вам дійсно потрібно's/user=&uid\./user=\&sysuserid./g'
don_crissti

1
так, "&" праворуч в основному означає "все, що збігається зліва", тому уникайте цього з "\". Ви повинні зробити це відповіддю, а не просто коментарем.
Едвард Фолк

мені не довелося бігти з першого періоду ... цікаво було просто головою у кого-небудь іншого :)
lucasdavis500

Відповіді:


25

&особливого в тексті заміни: це означає , що «всю частину введення , яка була співпала з шаблоном», так що ви робите тут , замінює user=&uidXз user=user=&uidXsysuserid.. Для того, щоб вставити фактичний символ "ampersand" в текст заміни, використовуйте \&.

Інша річ, яка виглядає неправильно - це те, що .в шаблоні пошуку стоїть будь-який символ (крім нового рядка), але .кінець тексту заміни - це буквальна крапка. Якщо ви хочете замінити лише буквений рядок user=&uid., захистіть їх .косою рисою.

sed -e 's/user=&uid\./user=\&sysuserid./g'

Якщо ви хочете замінити будь-який один символ і зберегти його в результаті, поставте його в групу і використовуйте \1для заміни для позначення цієї групи.

sed -e 's/user=&uid\(.\)/user=\&sysuserid\1/g'

Насправді, враховуючи повторення між початковим текстом та заміною, все одно слід використовувати групи:

sed -e 's/\(user=&\)u\(id\.\)/\1sysuser\2/g'

тобто «замінити uна sysuserміж user=&і id.».


ви могли б пояснити групи?
lucasdavis500

2
@ lucasdavis500 Група ідентифікує частину шаблону. Він обмежений зворотними косими дужками. Наприклад \(user=&\), це шаблон, який відповідає user&і зберігає рядок відповідності як групу (група № 1, оскільки це перша група у шаблоні). Тоді в заміну \1замінюється рядок, що зберігається для групи № 1.
Жил 'SO- перестань бути злим'

ти маєш на увазі (user = &) зберігає user = &, а не user &?
lucasdavis500

@ lucasdavis500 Я не розумію ваш коментар. Символ =у регулярних виразах та в тексті заміни означає себе, тому user=&відповідає лише user=&, а user=&в тексті заміни виходить user=наступна частина рядка, узгоджена з регулярним виразом.
Жил "ТАК - перестань бути злим"

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