Zamień tekst na sed i zachowaj część oryginalnego tekstu

20

Próbuję przekonwertować

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

do:

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

Zakładam, że najlepszym narzędziem do tego zadania byłoby sed, ale nie mogę wymyślić, jak zachować części oryginalnego tekstu w części zastępującej.

Jeśli zrobię:

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

Dane wyjściowe to:

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

Lub robiąc podobnie od wewnątrz vi, generuje:

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

Jak mogę to zrobić \1i \2zastąpić ich pierwotnymi wartościami?

Mikrofon
źródło

Odpowiedzi:

21

Możesz używać grup, np .:

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

Prawdopodobnie najbardziej mylącą częścią RE jest to, że istnieją różne smaki syntaktyczne.

Na przykład sed i vim używają podstawowych wyrażeń regularnych, w których trzeba zacytować, ()aby uzyskać ich meta-znaczenie.

W przypadku rozszerzonych wyrażeń regularnych (np. Awk, egrep i mniej) musisz zacytować, ()aby uzyskać dosłowne znaczenie. Istnieją podobne różnice dla innych metaznaków.

Uzasadnienie ()semantyki BRE jest takie, że gdy większość twoich danych wejściowych to C-Code, bardziej praktyczne jest cytowanie nawiasów dla meta-użycia.

maxschlepzig
źródło
To była właściwie pierwsza rzecz, której spróbowałem, ale nie uniknąłem znaków (i ). Głupie pytanie, ale dlaczego to konieczne?
Mike
1
@Mike, dobre pytanie - zaktualizowałem odpowiedź.
maxschlepzig