Saya punya file dengan konten berikut:
<username><![CDATA[name]]></username>
<password><![CDATA[password]]></password>
<dbname><![CDATA[name]]></dbname>
dan saya perlu membuat skrip yang mengubah "nama" di baris pertama menjadi "sesuatu", "kata sandi" di baris kedua menjadi "sesuatu yang lain", dan "nama" di baris ketiga menjadi "sesuatu yang berbeda". Saya tidak bisa mengandalkan urutan ini terjadi dalam file, jadi saya tidak bisa hanya mengganti kemunculan pertama "nama" dengan "sesuatu" dan kemunculan kedua "nama" dengan "sesuatu yang berbeda". Saya benar-benar perlu melakukan pencarian untuk string di sekitarnya untuk memastikan saya menemukan dan mengganti hal yang benar.
Sejauh ini saya telah mencoba perintah ini untuk menemukan dan mengganti nama "nama" pertama:
sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml
Namun itu tidak berfungsi jadi saya pikir beberapa karakter ini mungkin perlu melarikan diri, dll.
Idealnya, saya ingin dapat menggunakan regex untuk mencocokkan hanya dua kejadian "nama pengguna" dan hanya mengganti "nama". Sesuatu seperti ini tetapi dengan sed
:
<username>.+?(name).+?</username>
dan ganti konten di dalam tanda kurung dengan "sesuatu".
Apakah ini mungkin?
sumber
Jawaban:
Ini, saya pikir, apa yang Anda cari.
Penjelasan:
\1
,,\2
dll. di bagian kedua adalah referensi ke grup ke-i yang ditangkap di bagian pertama (penomoran dimulai dengan 1)-E
memungkinkan ekspresi reguler yang diperluas (diperlukan+
dan dikelompokkan).sumber
(original name) + "-E"
.\(
dan\)
bukannya(
dan)
.The
/username/
sebelums
memberitahu sed hanya bekerja pada baris yang mengandung string 'username'.sumber
Jika
sed
bukan persyaratan yang sulit, lebih baik gunakan alat khusus sebagai gantinya.Jika file Anda adalah XML yang valid (bukan hanya 3 tag yang tampak XML), maka Anda dapat menggunakan XMLStarlet :
Hal di atas juga akan berfungsi dalam situasi yang sulit dipecahkan dengan ekspresi reguler:
Demonstrasi singkat di atas:
sumber
Anda perlu mengutip
\[.*^$/
bagian ekspresi reguler daris
perintah dan\&/
di bagian pengganti, ditambah baris baru. Ekspresi reguler adalah ekspresi reguler dasar , dan sebagai tambahan Anda perlu mengutip pembatas untuks
perintah.Anda dapat memilih pembatas yang berbeda untuk menghindari kutip
/
. Anda harus mengutip karakter itu, tetapi biasanya titik mengubah pembatas adalah untuk memilih yang tidak terjadi pada teks yang akan diganti atau teks pengganti.Anda dapat menggunakan grup untuk menghindari pengulangan beberapa bagian dalam teks pengganti, dan mengakomodasi variasi pada bagian-bagian ini.
sumber
Anda cukup menggunakan alamat seperti pada angka sebelumnya "s" yang menunjukkan nomor baris.
Juga angka pada akhirnya memberitahu
sed
untuk mengganti pertandingan kedua alih-alih mengganti pertandingan pertama.sumber
Untuk mengganti kata "nama" dengan kata "sesuatu", gunakan:
Itu akan menggantikan semua kemunculan kata yang ditentukan.
Sejauh ini semua dikeluarkan ke output standar, Anda dapat menggunakan:
untuk menyimpan perubahan ke file lain.
sumber
jadi untuk mengganti nilai dalam file properti
sumber