Tiga sedperintah berbeda :
sed '$!N;s/"[^"]*"\n<[^>]*>/other characters /;P;D'
sed -e :n -e '$!N;s/"[^"]*"\n<[^>]*>/other characters /;tn'
sed -e :n -e '$!N;/"$/{$!bn' -e '};s/"[^"]*"\n<[^>]*>/other characters /g'
Mereka bertiga membangun di atas s///perintah ubstitusi dasar :
s/"[^"]*"\n<[^>]*>/other characters /
Mereka juga semua berusaha untuk berhati-hati dalam menangani baris terakhir, karena sedcenderung berbeda pada output mereka dalam kasus tepi. Inilah artinya $!alamat yang cocok dengan setiap baris yang !bukan yang $terakhir.
Mereka juga semua menggunakan Nperintah ext untuk menambahkan baris input berikutnya ke pola ruang mengikuti \nkarakter ewline. Siapa pun yang telah lama sedbelajar akan belajar untuk bergantung pada \nkarakter ewline - karena satu-satunya cara untuk mendapatkannya adalah dengan meletakkannya secara eksplisit di sana.
Ketiganya berusaha untuk membaca input sesedikit mungkin sebelum mengambil tindakan - sedbertindak secepat mungkin dan tidak perlu membaca seluruh file input sebelum melakukannya.
Meskipun mereka melakukan semuanya N, ketiganya berbeda dalam metode rekursi mereka.
Perintah Pertama
Perintah pertama menggunakan N;P;Dloop yang sangat sederhana . Tiga perintah ini terintegrasi untuk POSIX-compatible seddan saling melengkapi satu sama lain dengan baik.
N- seperti yang telah disebutkan, menambahkan Nbaris input ext ke pola-ruang setelah \npembatas ewline yang dimasukkan .
P- seperti p; itu Pmemecah pola-ruang - tetapi hanya sampai dengan \nkarakter ewline pertama yang terjadi . Maka, diberi input / perintah berikut:
printf %s\\n one two | sed '$!N;P;d'
sed Phanya satu . Namun, dengan ...
D- seperti d; itu Dmenghapus pola-ruang dan memulai siklus baris lain. Tidak seperti d , Dmenghapus hanya sampai garis tepi pertama yang terjadi \ndi pola-ruang. Jika ada lebih banyak ruang-pola mengikuti \nkarakter ewline, sedmulailah siklus baris berikutnya dengan yang tersisa. Jika ddalam contoh sebelumnya diganti dengan D, misalnya, sedakan Pmemecah satu dan dua .
Perintah ini hanya muncul untuk baris yang tidak cocok dengan s///pernyataan ubstitusi. Karena s///ubstitusi menghapus \newline yang ditambahkan N, tidak pernah ada yang tersisa ketika sed Dmenghapus pola-ruang.
Tes dapat dilakukan untuk menerapkan Pdan / atau Dsecara selektif, tetapi ada perintah lain yang lebih sesuai dengan strategi itu. Karena rekursi ini dilaksanakan untuk menangani garis berturut-turut yang cocok hanya bagian dari aturan pengganti, urutan berturut-turut dari garis pencocokan kedua ujung dari s///ubstitution tidak bekerja dengan baik .:
Diberikan masukan ini:
first "line"
<second>"line"
<second>"line"
<second>line and so on
... itu mencetak ...
first other characters "line"
<second>other characters line and so on
Namun, itu menangani
first "line"
second "line"
<second>line
...baik baik saja.
Perintah Kedua
Perintah ini sangat mirip dengan yang ketiga. Keduanya menggunakan label :bpeternakan / test (seperti juga ditunjukkan dalam jawaban Joeseph R. di sini ) dan kembali lagi ke sana dengan syarat tertentu.
-e :n -e- sedskrip portabel akan membatasi :definisi label dengan \newline atau -epernyataan xecution inline baru .
:n- mendefinisikan label bernama n. Ini dapat dikembalikan kapan saja dengan bnatau tn.
tn- tperintah est kembali ke label yang ditentukan (atau, jika tidak ada yang disediakan, keluar dari skrip untuk siklus baris saat ini) jika ada s///pengganti karena label itu ditentukan atau karena yang terakhir disebut tests berhasil.
Dalam perintah ini rekursi terjadi untuk garis yang cocok. Jika sedberhasil mengganti pola dengan karakter lain , sedkembali ke :nlabel dan coba lagi. Jika tidak terjadi s///ubstitusi, cetak sedpola-ruang dan mulailah siklus-baris berikutnya.
Ini cenderung menangani urutan berturut-turut dengan lebih baik. Di mana yang terakhir gagal, ini mencetak:
first other characters other characters other characters line and so on
Perintah Ketiga
Seperti disebutkan, logika di sini sangat mirip dengan yang terakhir, tetapi tes lebih eksplisit.
/"$/bn- ini adalah sedujian. Karena bperintah ranch adalah fungsi dari alamat ini, sedhanya akan branch kembali ke :nsetelah \newline ditambahkan dan pola-ruang masih berakhir dengan "tanda kutip ganda.
Ada sedikit yang dilakukan antara Ndan bmungkin - dengan cara ini seddapat dengan cepat mengumpulkan input sebanyak yang diperlukan untuk memastikan bahwa baris berikut tidak sesuai dengan aturan Anda. The s///ubstitution berbeda di sini bahwa itu mempekerjakan gbendera lobal - dan sehingga akan melakukan semua penggantian diperlukan sekaligus. Diberikan input identik perintah ini menghasilkan identik dengan yang terakhir.
\npernyataan ewline Anda membuat sebabnya saya bertanya. orang jarang bertanya apakah mereka bisa melakukans//\n/apa yang Anda bisa dengan GNUsed, meskipun kebanyakan orang lainsedakan menolak pelarian itu di sisi kanan. tetap saja, jalan\nkeluar akan bekerja di sebelah kiri dalam POSIX apa punseddan Anda dapat menerjemahkannya dengan mudah seolah-y/c/\n/olah itu akan memiliki efek yang sama sepertis/c/\n/gdan karenanya tidak selalu berguna.