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 !b
dalam sed
perintah 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 x
mengubah ruang pegang dan pola ruang kemudian masukkan string <space>
cat <space>
dog<space>
ke ruang pegang sebelum kita x
mengubahnya kembali.
Sejak saat itu dan pada setiap baris berikut saya G
tahan 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 P
hanya akan memotong hingga baris pertama yang terjadi pertama kali di ruang pola kemudian d
hapus 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.
-r
opsi sebagai sinonim dari-E
untuk kompatibilitas dengan GNU sed. OpenBSD dan OS Xsed -E
akan 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.