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?

Mike
sumber

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.

maxschlepzig
sumber
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