Metni sed ile değiştirin ve orijinal metnin bir kısmını saklayın


20

Dönüştürmeye çalışıyorum

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

için:

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

İş için en iyi aracın olacağını varsayıyorum sed, ancak orijinal metnin bir kısmını değiştirme bölümünde nasıl tutacağımı anlayamıyorum.

Eğer yaparsam:

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

Çıktı:

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

Ya da içeriden benzer bir vişey yaparsa, çıktı:

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

Bunu nasıl yapabilirim \1ve \2orijinal değerlerine geri konabilirim ?

Yanıtlar:


21

Grupları kullanabilirsiniz, örneğin:

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

Muhtemelen RE'lerle ilgili en kafa karıştırıcı kısım, çeşitli sözdizimsel tatlar olmasıdır.

Örneğin sed ve vim , meta anlamlarını almak için alıntı yapmanız gereken temel düzenli ifadeleri kullanır ().

İle genişletilmiş düzenli ifadeler (örneğin awk, egrep ve daha az) Tırnak işareti var ()gerçek anlamı olsun. Diğer meta karakterler için benzer farklılıklar vardır.

BRE ()semantiğinin ardındaki mantık , girdilerinizin çoğu C-Kodu olduğunda, meta kullanım için parantez teklif etmenin daha pratik olmasıdır.


Bu aslında denedim ilk şey, ama kaçmadı (ve )karakterleri. Aptalca bir soru, ama bu neden gerekli?
Mike

1
@Mike, iyi soru - cevabı güncelledi.
maxschlepzig
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.