Substitua o texto por sed e mantenha parte do texto original

20

Estou tentando converter

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

para:

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

Estou assumindo que a melhor ferramenta para o trabalho seria sed, no entanto, não consigo descobrir como manter partes do texto original na peça de substituição.

Se eu fizer:

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

A saída é:

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

Ou fazendo algo de dentro vi, ele gera:

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

Como posso fazer isso de modo que \1e \2seja substituído de volta aos seus valores originais?

Mike
fonte

Respostas:

21

Você pode usar grupos, por exemplo:

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

Provavelmente, a parte mais confusa sobre os REs é que existem vários sabores sintáticos.

Por exemplo, sed e vim usam expressões regulares básicas nas quais é necessário citar ()para obter seu meta-significado.

Com expressões regulares estendidas (por exemplo, awk, egrep e menos), é necessário citar ()para obter o significado literal. Existem diferenças semelhantes para outros meta-caracteres.

A lógica por trás da ()semântica do BRE é que, quando a maior parte de sua entrada é código C, é mais prático citar parênteses para meta-uso.

maxschlepzig
fonte
Esta foi realmente a primeira coisa que tentei, mas não escapei dos personagens (e ). Pergunta estúpida, mas por que isso é necessário?
Mike
11
@ Mike, boa pergunta - atualizou a resposta.
maxschlepzig 14/09/11