Tidak, karena regex tidak memiliki kecocokan yang tidak serakah.
Anda dapat mencocokkan semua teks hingga kemunculan pertama AC
dengan menggunakan "apa pun yang tidak mengandung AC
" diikuti oleh AC
, yang melakukan hal yang sama dengan Perl .*?AC
. Masalahnya adalah, "apa pun yang tidak mengandung AC
" tidak dapat diekspresikan dengan mudah sebagai ekspresi reguler: selalu ada ekspresi reguler yang mengenali negasi dari ekspresi reguler, tetapi regasi negasi menjadi rumit dengan cepat. Dan dalam sed portabel, ini tidak mungkin sama sekali, karena regasi negasi memerlukan pengelompokan pergantian yang hadir dalam ekspresi reguler yang diperluas (misalnya dalam awk) tetapi tidak dalam ekspresi reguler dasar portabel. Beberapa versi sed, seperti GNU sed, memang memiliki ekstensi untuk BRE yang membuatnya mampu mengekspresikan semua ekspresi reguler yang mungkin.
sed 's/AB\([^A]*\|A[^C]\)*A*AC/XXX/'
Karena kesulitan meniadakan regex, ini tidak bisa digeneralisasi dengan baik. Yang bisa Anda lakukan adalah mengubah garis sementara. Dalam beberapa implementasi sed, Anda dapat menggunakan baris baru sebagai penanda, karena mereka tidak dapat muncul di baris input (dan jika Anda membutuhkan banyak penanda, gunakan baris baru diikuti oleh karakter yang berbeda-beda).
sed -e 's/AC/\
&/g' -e 's/AB[^\
]*\nAC/XXX/' -e 's/\n//g'
Namun, berhati-hatilah bahwa backslash-newline tidak berfungsi di set karakter dengan beberapa versi sed. Secara khusus, ini tidak berfungsi di GNU sed, yang merupakan implementasi sed pada Linux yang tidak tertanam; di GNU sed Anda bisa menggunakan \n
:
sed -e 's/AC/\
&/g' -e 's/AB[^\n]*\nAC/XXX/' -e 's/\n//g'
Dalam kasus khusus ini, cukup untuk mengganti yang pertama AC
dengan baris baru. Pendekatan yang saya sampaikan di atas lebih umum.
Pendekatan yang lebih kuat dalam sed adalah untuk menyimpan garis ke ruang penahanan, menghapus semua kecuali bagian "menarik" pertama dari garis, menukar ruang penahanan dan ruang pola atau menambahkan ruang pola ke ruang penahan dan ulangi. Namun, jika Anda mulai melakukan hal-hal yang rumit ini, Anda harus benar-benar berpikir untuk beralih ke awk. Awk juga tidak memiliki kecocokan non-serakah, tetapi Anda dapat membagi string dan menyimpan bagian-bagian ke dalam variabel.