Bunu yapmanın taşınabilir yolu - ve daha verimli yolu - adreslerle. Bunu yapabilirsiniz:
printf %s\\n cat dog pear banana cat dog |
sed -e '/cat/!{/dog/!b' -e '};cBear'
Bu şekilde, satır kedi dizesini içermiyorsa ve kodun dışına yayılmış köpek dizesini sed
b
içermiyorsa, geçerli satırına otomatik olarak basar ve bir sonraki çevrime başlamak için bir sonrakine geçer. Bu nedenle bir sonraki talimatı yerine getirmez - bu örnekte c
tüm satırı Ayı'yı okumak için sarkar, ancak bir şey yapabilir.
Ayrıca belirterek muhtemelen değer olduğunu aşağıdaki herhangi deyim !b
ki sed
komuta edebilirsiniz yalnızca dize ya içeren bir satırda maç dog
veya cat
- Şimdi kurallarını uygulamak anlamına gelir - Eğer değil bir çizgi eşleşen herhangi bir tehlike olmaksızın başka testler böylece Sadece birisine veya diğerine.
Ama sıradaki o. İşte yukarıdaki komuttan çıktı:
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
Ayrıca geri referansları olan arama tablosunu taşınabilir bir şekilde uygulayabilirsiniz.
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ cat dog /;x
};G;s/^\(.*\)\n.* \1 .*/Bear/;P;d'
Bu basit örnek durum için kurulum yapmak çok daha fazla iş, ancak sed
uzun vadede daha esnek komut dosyaları oluşturabilir.
İlk satır I e de x
dize insert sonra değişiklik tutma alanı ve desen alanı <space>
kedi <space>
köpek<space>
e öncesinde tutma uzaya x
geri değişiyor.
O andan itibaren ve sonraki her satırda G
desen uzayına eklenen bir boşluk tutuyorum, sonra satırın başından sonuna kadar eklediğim yeni satırın sonuna kadar tüm karakterlerin ondan sonra boşluklarla çevrili bir dizeyle eşleşip eşleşmediğini kontrol edin. Öyleyse, tüm partiyi Bear ile değiştiririm ve eğer zarar görmemişsem, çünkü P
sadece desen uzayındaki ilk ortaya çıkan yeni d
çizgiyi işaretlerim, sonra hepsini seçerim.
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
Ve esnek derken, onu kastediyorum. Burada yerini aldığı kediyi ile brownbear ve köpek ile Blackbear :
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ 1cat Brown 2dog Black /;x
};G;s/^\(.*\)\n.* [0-9]\1 \([^ ]*\) .*/\2Bear/;P;d'
###OUTPUT###
BrownBear
BlackBear
pear
banana
BrownBear
BlackBear
Tabii ki, arama tablosunun içeriğini büyük ölçüde genişletebilirsiniz - 90'lı yıllarda, tek bir açıklamadan nasıl kaba bir hesap makinesi oluşturduğunu anlattığında konuyu Greg Ubben'in usenet e-postalarından aldım sed s///
.
-r
seçeneği-E
GNU sed ile uyumluluk için eşanlamlı olarak destekliyor . OpenBSD'ler ve OSsed -E
X'ler, çıkış borusunu alternatif operatör olarak değil, değişmez bir boru olarak yorumlayacaktır. İşte NetBSD man sayfasına çalışan bir link ve işte on yaşında olmayan OpenBSD için bir link .