Замініть текст Sed і збережіть частину початкового тексту


20

Я намагаюся конвертувати

<id>1</id>
<Name>ENTERPRISE RESOURCE PLANNING</Name>

до:

<column name="id">1</column>
<column name="Name">ENTERPRISE RESOURCE PLANNING</column>

Я припускаю, що найкращим інструментом для роботи буде sed, однак я не можу зрозуміти, як зберегти частини оригінального тексту в замінній частині.

Якщо я:

$ sed -i 's/<.*>.*<.*>/<column name="\\1">\\2<\/column>/g' filename.xml

Вихід:

<column name="\1">\2</column>
<column name="\1">\2</column>

Або роблячи подібне зсередини vi, воно виводить:

<column name=""></column>
<column name=""></column>

Як я можу зробити так , щоб \1і \2підставляються назад до своїх початкових значень?

Відповіді:


21

Ви можете використовувати групи, наприклад:

$ sed -i 's/<\(.*\)>\(.*\)<.*>/<column name="\1">\2<\/column>/g' filename.xml

Напевно, найбільш заплутаною частиною щодо РЕ є те, що існують різні синтаксичні смаки.

Наприклад, sed і vim використовують основні регулярні вирази, де вам потрібно цитувати, ()щоб отримати їх мета-значення.

З розширеними регулярними виразами (наприклад, awk, egrep і менше) вам доведеться цитувати, ()щоб отримати буквальне значення. Існують подібні відмінності і для інших мета-персонажів.

Обґрунтуванням ()семантики BRE є те, що коли більшість ваших даних є С-кодом, тоді більш практичним є цитування дужок для метавикористання.


Це було насправді перше, що я спробував, але я не уникнув (і )персонажів. Дурне питання, але навіщо це потрібно?
Майк

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