Cara portabel untuk melakukan ini - dan cara yang lebih efisien - adalah dengan alamat. Kamu bisa melakukan ini:
printf %s\\n cat dog pear banana cat dog |
sed -e '/cat/!{/dog/!b' -e '};cBear'
Dengan cara ini jika baris tidak mengandung cat string dan tidak berisi string dog sed b ranches keluar dari skrip, autoprint baris saat ini dan menarik yang berikutnya untuk memulai siklus berikutnya. Karena itu tidak melakukan instruksi selanjutnya - yang dalam contoh inic menggantung seluruh baris untuk membaca Bear tetapi bisa melakukan apa saja.
Ini mungkin perlu dicatat juga bahwa pernyataan apapun menyusul !bdalam sedperintah dapat hanya cocok pada baris yang berisi baik stringdog atau cat- sehingga Anda dapat melakukan tes lebih lanjut tanpa bahaya pencocokan garis yang tidak - yang berarti Anda sekarang dapat menerapkan aturan hanya satu atau yang lain juga.
Tapi selanjutnya. Ini output dari perintah di atas:
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
Anda juga dapat mengimplementasikan tabel pencarian dengan referensi belakang dengan mudah.
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ cat dog /;x
};G;s/^\(.*\)\n.* \1 .*/Bear/;P;d'
Lebih banyak pekerjaan yang harus disiapkan untuk contoh kasus sederhana ini, tetapi dapat membuatnya lebih fleksibel sed skrip yang dalam jangka panjang.
Pada baris pertama saya xmengubah ruang pegang dan pola ruang kemudian masukkan string <space>cat <space>dog<space> ke ruang pegang sebelum kita xmengubahnya kembali.
Sejak saat itu dan pada setiap baris berikut saya Gtahan ruang ditambahkan ke ruang pola, lalu periksa untuk melihat apakah semua karakter dari awal baris sampai baris baru yang saya tambahkan pada akhirnya cocok dengan string yang dikelilingi oleh spasi setelahnya. Jika demikian, saya mengganti seluruh lot dengan Bear dan jika tidak, tidak ada salahnya dilakukan karena saya Phanya akan memotong hingga baris pertama yang terjadi pertama kali di ruang pola kemudian dhapus semuanya.
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
Dan ketika saya mengatakan fleksibel, saya sungguh-sungguh. Ini dia ganti kucing dengan BrownBear dan anjing dengan 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
Anda tentu saja dapat memperluas banyak hal pada isi tabel pencarian - saya mengambil ide dari email usenet Greg Ubben tentang masalah tersebut ketika, pada tahun 90-an, dia menggambarkan bagaimana dia membuat kalkulator kasar dari satu sed s///pernyataan.
-ropsi sebagai sinonim dari-Euntuk kompatibilitas dengan GNU sed. OpenBSD dan OS Xsed -Eakan menafsirkan pipa yang lolos sebagai pipa literal, bukan sebagai operator bergantian. Inilah tautan yang berfungsi ke halaman manual NetBSD dan ini satu untuk OpenBSD yang belum berusia sepuluh tahun.