Substitua texto por sed e mantenha parte do texto original

19

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 , mas não consigo descobrir como manter partes do texto original na parte de substituição.

Se eu fizer:

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

A saída é:

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

Ou fazendo algo semelhante a partir de vi , o resultado é:

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

Como posso fazer com que e sejam substituídos de volta aos valores originais?

    
por Mike 14.09.2011 / 20:46

1 resposta

21

Você pode usar grupos, por exemplo:

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

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

Por exemplo, sed e vim usam expressões regulares básicas onde você tem que citar () para obter seu meta-significado.

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

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

    
por 14.09.2011 / 20:52