Saya memiliki kebiasaan menulis satu baris per kalimat karena saya biasanya mengkompilasi sesuatu ke LaTex, atau saya menulis dalam beberapa format lain di mana jeda baris diabaikan. Saya menggunakan baris kosong untuk menunjukkan awal paragraf baru.
Sekarang, saya memiliki file yang ditulis dengan gaya ini yang ingin saya kirimkan sebagai teks biasa. Saya ingin menghapus semua linebreak tunggal tetapi membiarkan double linebreak utuh. Inilah yang telah saya lakukan:
sed 's/$^/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt
Ini menggantikan baris kosong dengan beberapa teks yang saya yakin tidak muncul dalam file: NEWLINE
dan kemudian menghapus semua jeda baris dengan awk (saya menemukan trik itu di beberapa situs web) dan kemudian mengganti huruf NEWLINE
s dengan dua linebreak yang diperlukan. .
Ini sepertinya cara yang panjang lebar untuk melakukan hal yang cukup sederhana. Apakah ada cara yang lebih sederhana? Juga, jika ada cara untuk mengganti beberapa ruang (yang terkadang merayap karena suatu alasan) dengan ruang tunggal, itu juga bagus.
Saya menggunakan emacs, jadi jika ada beberapa trik spesifik emacs yang bagus, tetapi saya lebih suka melihat versi sed murni atau versi awk murni.
tr -d "\n"
.Jawaban:
Anda dapat menggunakan awk seperti ini:
Atau jika Anda membutuhkan baris baru tambahan di akhir:
Atau jika Anda ingin memisahkan paragraf dengan baris baru:
Perintah awk ini menggunakan tindakan yang dijaga oleh pola:
atau
Tindakan berikut hanya dijalankan jika polanya cocok dengan garis saat ini.
Dan
^$.
karakter memiliki makna khusus dalam ekspresi reguler, di mana^
cocok dengan awal garis,$
akhir, dan.
karakter yang berubah-ubah.sumber
/./
dilakukan: tampaknya bertindak seperti danelse
untuk/^$/
pertandingan string, apakah itu benar?Gunakan mode paragraf Awk atau Perl untuk memproses file paragraf demi paragraf, di mana paragraf dipisahkan oleh baris kosong.
Tentu saja, karena ini tidak mem-parsing (La) TeX, itu akan sangat buruk memutilasi komentar, lingkungan kata demi kata dan sintaks khusus lainnya. Anda mungkin ingin melihat ke DeTeX atau konverter TeX-to-text (La) lainnya.
sumber
Solusi Sed
Perhatikan, bahwa dalam solusi
:a
ini membuat label dan tidak menggunakana
perintah.Mengganti Beberapa Spasi
Gunakan
tr
:$ tr -s ' ' <test.text
sumber
Jika saya mengerti dengan benar, baris kosong menyiratkan dua baris baru berturut-turut
\n\n
,.Jika demikian, salah satu solusi yang mungkin untuk menghilangkan semua kejadian tunggal baris baru.
Dalam Perl, pernyataan lookahead adalah salah satu cara untuk mencapai ini:
-0777
bendera efektif slurps seluruh file ke dalam string tunggal-p
memberitahu perl untuk mencetak string yang berfungsi secara default-i
menentukan pengeditan di tempatsumber
(Menghidupkan kembali pertanyaan kuno)
Ini tampaknya persis seperti apa
fmt
danpar
untuk format ulang paragraf. Seperti Anda (dan juga seperti banyak program) mereka mendefinisikan batas paragraf sebagai satu (atau lebih) baris kosong. Coba perpip teks Anda melalui salah satu dari ini.fmt
adalah utilitas unix standar dan dapat ditemukan di GNU Coreutils.par
adalah tulisan yang sangat ditingkatkanfmt
oleh Adam M. Costello yang dapat ditemukan di http://www.nicemice.net/par/ (juga telah dikemas untuk beberapa distribusi, termasuk debian - Saya mengemasnya untuk debian pada Januari 1996, meskipun ada pengelola baru untuk pkg sekarang.).sumber
sed
akan menambahkan baris apa pun keH
ruang lama yang berisi setidaknya satu karakter. Segera setelah itud
menghapus semua dari mereka kecuali mungkin yang terakhir. Satu-satunya garis yang bisa tetap kosong, dan itu ada di garis-garis ini ketikased
ex
mengubah ruang penahanan dan pola dan menghapus semua\n
karakter garis turunan terakumulasi .Jika Anda ingin baris yang hanya berisi <tab> atau <spasi> dianggap kosong, ganti
/./
alamat di atas dengan/[^[:blank:]]/
. Untuk juga memeras spasi, lakukan:sumber
Setelah melihat perl dan awk contoh-contoh kompak Gilles, saya enggan memposting ini, tetapi saya sudah menjalani latihan ini, dan ini adalah skrip yang berfungsi, yang didokumentasikan dengan cukup; titik ini saja mungkin menarik bagi beberapa .. (sed dengan komentar! :)
Skrip ini menganggap baris kosong sebagai kosong meskipun mengandung spasi.
Beberapa spasi dalam teks diringkas menjadi satu ruang.
Trailing whitespace dihapus dari baris teks. Baris kosong berturut-turut diciutkan menjadi satu baris. Script meninggalkan baris kosong atas dan bawah tetap utuh.
Untuk apa pun selain skrip yang paling sepele, sed dapat ditulis lebih mudah dalam bentuk terstruktur, sebagai file skrip terpisah. Inilah contohnya.
menggunakan
panggilan sintaks regex yang diperluas : $ sed -rf script text-file
Catatan:,
flush
dalam komentar, berarti: mengirim pola-ruang untuk penanganan stdout internal sed. Itu tidak berarti cetakan pasti untuk stdout. Outputnya tergantung pada-n
opsi sed . misalnya. yangq
perintah berarti flush dan berhenti ... Bandingkan dua potongan ini:echo x |sed -e q
cetakan x,echo x |sed -ne q
cetakan tidak ada, sedangkan dengan menggunakanp
perintah akan mencetak 'x' dua kali atau sekali, tergantung pada-n
pilihan.sumber
Berikut ini
sed
solusi lain yang menggabungkan semua garis kesed
dalam "ruang pegang" sehingga kami mendapatkan satu string panjang yang akhirnya disalin ke "ruang pola" untuk pencocokan pola.Karena baris baru akan dipertahankan dalam string panjang terakhir dalam
sed
"ruang pola", garis kosong dalam hal linebreak ganda[^\n]\n\n[^\n]
dapat dicocokkan dan dimodifikasi untuk[^\n]\n[^\n]
.Untuk informasi lebih lanjut, lihat, misalnya dan Pencarian dan Ganti Multi-Line .
sumber
Ini mungkin sekolah tua:
Ini akan menampilkan teks Anda rata kiri (
.ad l
), dengan panjang garis 80 (.ll 80
). Opsi panjang halaman (.pl
) memberi tahu pemroses teks untuk melakukan padding halaman untuk panjang halaman 1, jadi tidak ada padding halaman.Jika Anda ingin semua paragraf Anda dalam satu baris, Anda bisa menggunakan banyak untuk
.ll
:man 7 groff untuk opsi pemformatan lainnya.
sumber
Di Emacs, saya terkadang menggunakan ini
regex
:Cara:
sumber
Ternyata dengan
auto-fill-mode
aktif, emacs melakukan pekerjaan yang cukup baik untuk kasus penggunaan sederhana saya hanya denganM-q
...sumber
auto-fill-mode
bergantung pada mode utama apa yang Anda aktifkan.