Mengganti teks dengan sed dan menyimpan bagian dari teks asli


20

Saya mencoba untuk bertobat

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

untuk:

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

Saya mengasumsikan alat terbaik untuk pekerjaan itu sed, namun saya tidak tahu bagaimana menjaga bagian dari teks asli di bagian pengganti.

Jika aku melakukan:

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

Outputnya adalah:

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

Atau melakukan hal serupa dari dalam vi, ini menghasilkan:

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

Bagaimana saya bisa membuatnya \1dan \2diganti kembali ke nilai aslinya?

Jawaban:


21

Anda dapat menggunakan grup, misalnya:

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

Mungkin bagian yang paling membingungkan tentang RE adalah bahwa ada berbagai rasa sintaksis.

Misalnya sed dan vim gunakan ekspresi reguler dasar di mana Anda harus mengutip ()untuk mendapatkan meta-makna mereka.

Dengan ekspresi reguler yang diperluas (mis. Awk, egrep, dan kurang) Anda harus mengutip ()untuk mendapatkan makna literal. Ada perbedaan serupa untuk meta-karakter lainnya.

Alasan di balik ()semantik BRE adalah bahwa ketika sebagian besar input Anda adalah C-Code maka lebih praktis jika harus mengutip tanda kurung untuk penggunaan meta.


Ini sebenarnya adalah hal pertama yang saya coba, tetapi saya tidak melarikan diri (dan )karakter. Pertanyaan bodoh, tetapi mengapa itu perlu?
Mike

1
@ Mike, pertanyaan bagus - memperbarui jawabannya.
maxschlepzig
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.