Sed kullanarak çok karakterli dizelerin açgözlü olmayan eşleştirmesi bu şekilde yapılır. Her değiştirmek istediğiniz Diyelim foo...bar
için <foo...bar>
böylece örneğin bu girişi:
$ cat file
ABC foo DEF bar GHI foo KLM bar NOP foo QRS bar TUV
bu çıktı olmalı:
ABC <foo DEF bar> GHI <foo KLM bar> NOP <foo QRS bar> TUV
Bunu yapmak için foo ve çubuğu ayrı ayrı karakterlere dönüştürür ve daha sonra bu karakterlerin aralarındaki olumsuzlamayı kullanırsınız:
$ 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
Yukarıda:
s/@/@A/g; s/{/@B/g; s/}/@C/g
dönüştürülür {
ve }
girdide bulunmayan yer tutucu dizelere dönüştürülür , böylece bu grafikler dönüştürülebilir foo
vebar
için.
s/foo/{/g; s/bar/}/g
dönüştürmektedir foo
ve bar
için {
ve }
sırasıyla
s/{[^{}]*}/<&>/g
dönüştürme - istediğimiz op performans foo...bar
için<foo...bar>
s/}/bar/g; s/{/foo/g
dönüştürmektedir {
ve }
geri foo
ve bar
.
s/@C/}/g; s/@B/{/g; s/@A/@/g
yer tutucu dizelerini orijinal karakterlerine geri dönüştürüyor.
Yukarıdakilerin, ilk adımda bu tür dizeler ürettiği için girişte bulunmayan belirli bir dizeye dayanmadığını {[^{}]*}
ve gerektiği kadar çok kez kullanabileceğiniz için hangi belirli regexp'in eşleşmesini istediğinizi önemsemediğini unutmayın. ifadesinde istediğiniz gerçek eşleşmeyi izole etmek ve / veya seds sayısal eşleme işleci ile, örneğin yalnızca 2. gerçekleşmeyi değiştirmek için:
$ 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