Ini adalah, sed
perintah yang diakui samar ,. Khusus (dari man sed
):
: label
Label untuk perintah b dan t.
t label
Jika sebagai /// telah melakukan penggantian yang sukses sejak baris input terakhir dibaca dan sejak perintah t atau T terakhir, maka percabangan untuk melabeli; jika label dihilangkan, cabang ke akhir skrip.
n N Baca / tambahkan baris input berikutnya ke dalam ruang pola.
Jadi, skrip yang Anda poskan dapat dipecah menjadi (spasi ditambahkan untuk dibaca):
sed ':a; $!N; s/\n/string/; ta'
--- ---- ------------- --
| | | |--> go back (`t`) to `a`
| | |-------------> substitute newlines with `string`
| |----------------------> If this is not the last line (`$!`), append the
| next line to the pattern space.
|----------------------------> Create the label `a`.
Pada dasarnya, apa yang dilakukan ini dapat ditulis dalam pseudocode sebagai
while (not end of line){
append current line to this one and replace \n with 'string'
}
Anda dapat memahami ini sedikit lebih baik dengan contoh input yang lebih kompleks:
$ printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;$!N;s/\n/string/;ta'
line1stringline2stringline3stringline4stringline5
Saya tidak begitu yakin mengapa !$
ini diperlukan. Sejauh yang saya tahu, Anda bisa mendapatkan hasil yang sama
printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;N;s/\n/string/;ta'