Заменить текст с помощью 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

Вероятно, самая запутанная часть о RE - то, что есть различные синтаксические ароматы.

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

С расширенными регулярными выражениями (например, awk, egrep и less) вы должны заключать в кавычки, ()чтобы получить буквальное значение. Есть аналогичные различия для других метасимволов.

Обоснование ()семантики BRE состоит в том, что, когда большая часть вашего ввода представляет собой C-код, тогда более практично использовать кавычки для мета-использования.

maxschlepzig
источник
На самом деле это было первое, что я попробовал, но я не избежал (и )персонажей. Глупый вопрос, но зачем это нужно?
Майк
1
@ Майк, хороший вопрос - обновил ответ.
maxschlepzig