Saya memiliki file besar yang memiliki karakter khusus di dalamnya. Ada kode multi-line di sana, yang ingin saya ganti sed
.
Ini:
text = "\
------ ------\n\n\
This message was automatically generated by email software\n\
The delivery of your message has not been affected.\n\n\
------ ------\n\n"
Perlu diubah menjadi ini:
text = ""
Saya mencoba kode berikut, tetapi tidak berhasil:
sed -i '/ text = "*/ {N; s/ text = .*affected.\./ text = ""/g}' /etc/exim.conf
Itu tidak menggantikan apa pun dan tidak menampilkan pesan kesalahan apa pun
Saya telah bermain dengannya, tetapi semua yang saya coba tidak berhasil.
text-processing
sed
perl
blade19899
sumber
sumber
sed
atau Anda terbuka untuk alat lain? Bisa ada"
di dalamtext=
blok? Bisakah ada kasus laintext =
dalam file Anda? Akankah selalu ada 4 baris teks atau dapatkah ada lebih / kurang?sed
, atau apa pun yang tidak memerlukan instalasi di server CentOS. Alat luar kotaktext =
di folder, yang keluar harustext = ""
. File-file ini memiliki 891 baris kode. JADI, perlu menghormati teks lain.text = ""
. Seperti yang terlihat dalam pertanyaan saya.Jawaban:
Perl untuk penyelamatan:
-i~
akan mengedit file "di tempat", meninggalkan salinan cadangan-0777
membaca seluruh file sekaligus, bukan baris demi barisSubstitusi
s///
bekerja sama seperti dalam sed (yaitu cocoktext = "
dengan diikuti oleh apa pun kecuali tanda kutip berkali-kali hingga tanda kutip ganda), tetapi dalam kasus ini, ia bekerja pada seluruh file.sumber
Anda harus memeriksa ruang pola dan terus menarik
N
garis ext jika tidak cocok misalnyadengan
gnu sed
Anda dapat menuliskannya sebagaiItu tidak terlalu efisien, lebih baik pilih rentang
/text = "/,/"/
, modifikasi baris pertama dan hapus sisanya:lagi, dengan
gnu sed
Anda dapat menuliskannya sebagai satu-baris:sumber
Secara pribadi, saya akan melakukan ini di Perl. Jika kita dapat berasumsi bahwa tidak ada
"
sebelum penutupan"
, Anda dapat melakukan:The
-0
slurps seluruh file, membaca ke dalam memori. The-p
berarti "mencetak setiap baris (di sini, 'garis' akan seluruh file) setelah menerapkan script yang diberikan oleh-e
". Script itu sendiri adalah operator substitusi sederhana. Ini akan menangkap stringtext
diikuti oleh 0 atau lebih karakter spasi,=
dan 0 atau lebih spasi putih lagi (text\s*=\s*
) dan simpan sebagai$1
. Kemudian, itu akan menggantikan pola yang ditangkap serta string yang dikutip terpendek yang ditemukannya dengan pola ($1
) dan""
. Thes
flag membuat.
baris baru pertandingan.sumber
-00
dibaca dalam paragraf, bukan seluruh file ( ref ). Jika teks dalam tanda kutip berisi baris kosong, maka regex tidak akan cocok.perl -00ne 'print;exit'
. Dan saya masih memasukkan jawaban yang salah! Terima kasih, perbaiki sekarang.