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?

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.