Saya perhatikan, jika saya menambahkan n
ke pola untuk mengganti menggunakan sed
, tidak cocok. Contoh:
$ cat > alpha.txt
This is
a test
Please do not
be alarmed
$ sed -i'.original' 's/a testnPlease do not/not a testnBe/' alpha.txt
$ diff alpha.txt{,.original}
$ # No differences printed out
Bagaimana saya bisa membuatnya bekerja?
Jawaban yang Diterima:
Dalam panggilan paling sederhana sed , ia memiliki satu baris teks dalam ruang pola, yaitu. 1 baris n
teks yang dipisahkan dari input. Satu baris dalam ruang pola tidak memiliki n
… Itu sebabnya ekspresi reguler Anda tidak menemukan apa pun.
Anda dapat membaca beberapa baris ke dalam ruang pola dan memanipulasi hal-hal dengan sangat baik, tetapi dengan upaya yang lebih dari biasanya.. Sed memiliki serangkaian perintah yang memungkinkan hal semacam ini… Berikut ini tautan ke Ringkasan Perintah untuk sed. Ini adalah yang terbaik yang pernah saya temukan, dan membuat saya bersemangat.
Namun, lupakan ide "satu baris" setelah Anda mulai menggunakan perintah mikro sed. Sangat berguna untuk meletakkannya seperti program terstruktur sampai Anda merasakannya… Ini sangat sederhana, dan juga tidak biasa. Anda dapat menganggapnya sebagai "bahasa penyusun" pengeditan teks.
Ringkasan:Gunakan sed untuk hal-hal sederhana, dan mungkin sedikit lebih, tetapi secara umum, ketika melampaui bekerja dengan satu baris, kebanyakan orang lebih suka sesuatu yang lain…
Saya akan membiarkan orang lain menyarankan sesuatu yang lain.. Saya 'm benar-benar tidak yakin apa pilihan terbaik (saya akan menggunakan sed, tapi itu karena saya tidak tahu Perl cukup baik.)
sed '/^a test$/{
$!{ N # append the next line when not on the last line
s/^a testnPlease do not$/not a testnBe/
# now test for a successful substitution, otherwise
#+ unpaired "a test" lines would be mis-handled
t sub-yes # branch_on_substitute (goto label :sub-yes)
:sub-not # a label (not essential; here to self document)
# if no substituion, print only the first line
P # pattern_first_line_print
D # pattern_ltrunc(line+nl)_top/cycle
:sub-yes # a label (the goto target of the 't' branch)
# fall through to final auto-pattern_print (2 lines)
}
}' alpha.txt
Ini adalah skrip yang sama, diringkas menjadi apa yang jelas lebih sulit untuk dibaca dan digunakan, tetapi beberapa orang akan dengan ragu menyebut satu baris
sed '/^a test$/{$!{N;s/^a testnPlease do not$/not a testnBe/;ty;P;D;:y}}' alpha.txt
Ini perintah saya "cheat-sheet"
: # label
= # line_number
a # append_text_to_stdout_after_flush
b # branch_unconditional
c # range_change
d # pattern_delete_top/cycle
D # pattern_ltrunc(line+nl)_top/cycle
g # pattern=hold
G # pattern+=nl+hold
h # hold=pattern
H # hold+=nl+pattern
i # insert_text_to_stdout_now
l # pattern_list
n # pattern_flush=nextline_continue
N # pattern+=nl+nextline
p # pattern_print
P # pattern_first_line_print
q # flush_quit
r # append_file_to_stdout_after_flush
s # substitute
t # branch_on_substitute
w # append_pattern_to_file_now
x # swap_pattern_and_hold
y # transform_chars