Ini adalah cara melakukan pencocokan non-serakah dari string multi-karakter menggunakan sed. Katakanlah Anda ingin mengubah setiap foo...bar
untuk <foo...bar>
jadi misalnya masukan ini:
$ cat file
ABC foo DEF bar GHI foo KLM bar NOP foo QRS bar TUV
harus menjadi output ini:
ABC <foo DEF bar> GHI <foo KLM bar> NOP <foo QRS bar> TUV
Untuk melakukan itu, Anda mengonversi foo dan bilah menjadi karakter individual dan kemudian menggunakan negasi dari karakter tersebut di antara mereka:
$ sed 's/@/@A/g; s/{/@B/g; s/}/@C/g; s/foo/{/g; s/bar/}/g; s/{[^{}]*}/<&>/g; s/}/bar/g; s/{/foo/g; s/@C/}/g; s/@B/{/g; s/@A/@/g' file
ABC <foo DEF bar> GHI <foo KLM bar> NOP <foo QRS bar> TUV
Di atas:
s/@/@A/g; s/{/@B/g; s/}/@C/g
mengonversi {
dan }
ke string placeholder yang tidak dapat ada di input sehingga karakter-karakter tersebut kemudian tersedia untuk dikonversi foo
dan bar
ke.
s/foo/{/g; s/bar/}/g
mengkonversi foo
dan bar
ke {
dan }
masing - masing
s/{[^{}]*}/<&>/g
sedang melakukan operasi yang kita inginkan - mengonversi foo...bar
ke<foo...bar>
s/}/bar/g; s/{/foo/g
mengubah {
dan }
kembali ke foo
dan bar
.
s/@C/}/g; s/@B/{/g; s/@A/@/g
sedang mengonversi string placeholder kembali ke karakter aslinya.
Perhatikan bahwa hal di atas tidak bergantung pada string tertentu yang tidak ada pada input karena string tersebut diproduksi pada langkah pertama, juga tidak peduli kemunculan regexp tertentu yang ingin Anda cocokkan karena Anda dapat menggunakan {[^{}]*}
sebanyak yang diperlukan dalam ekspresi untuk mengisolasi kecocokan sebenarnya yang Anda inginkan dan / atau dengan operator pencocokan angka sed, misalnya untuk hanya mengganti kemunculan ke-2:
$ sed 's/@/@A/g; s/{/@B/g; s/}/@C/g; s/foo/{/g; s/bar/}/g; s/{[^{}]*}/<&>/2; s/}/bar/g; s/{/foo/g; s/@C/}/g; s/@B/{/g; s/@A/@/g' file
ABC foo DEF bar GHI <foo KLM bar> NOP foo QRS bar TUV