Sostituisci il testo con sed e mantieni parte del testo originale


20

Sto cercando di convertire

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

a:

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

Sto supponendo che lo strumento migliore per il lavoro sarebbe sed, tuttavia non riesco a capire come mantenere parti del testo originale nella parte di sostituzione.

Se lo faccio:

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

L'output è:

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

O facendo viqualcosa di simile dall'interno , produce:

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

Come posso fare in modo che \1e \2vengono sostituiti tornare ai valori originali?

Risposte:


21

È possibile utilizzare gruppi, ad esempio:

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

Probabilmente la parte più confusa delle RE è che ci sono vari gusti sintattici.

Ad esempio sed e vim usano espressioni regolari di base in cui devi citare ()per ottenere il loro meta-significato.

Con espressioni regolari estese (ad es. Awk, egrep e meno) devi citare ()per ottenere il significato letterale. Esistono differenze simili per altri meta-personaggi.

La logica alla base della ()semantica BRE è che quando la maggior parte dei tuoi input è codice C, è più pratico citare le parentesi per il meta-utilizzo.


Questa è stata in realtà la prima cosa che ho provato, ma non sono sfuggito ai personaggi (e ). Domanda stupida, ma perché è necessario?
Mike,

1
@ Mike, bella domanda - aggiornata la risposta.
maxschlepzig,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.