File teks saya terlihat seperti ini:
This is one
sentence that is broken.
However this is a good one.
And this
one is
somehow, broken into
many.
Saya ingin menghapus karakter baris baru untuk setiap baris yang diikuti oleh baris yang dimulai dengan huruf kecil.
Jadi ini seharusnya:
This is one sentence that is broken.
However this is a good one.
And this one is somehow, broken into many.
Bagaimana saya bisa melakukan ini?
Sunting: Ada beberapa jawaban yang sangat bagus di sini, tetapi saya memilih untuk menerima yang pertama yang berhasil dan paling awal. Terima kasih banyak semuanya!
Jawaban:
mencoba
dimana
$NF !~ /\.$/
garis kecocokan di mana elemen terakhir tidak berakhir dengan titik,{ printf "%s ",$0
cetak baris ini dengan spasi tambahan, dan tanpa umpan baris,next ; }
ambil baris berikutnya,{print;}
dan cetak.Saya yakin akan ada
sed
opsi.Catatan: ini akan bekerja dengan baris yang diakhiri dengan titik, namun kondisi dalam kalimat yang dimulai dengan huruf besar tidak akan digabungkan. Lihat jawaban Stéphane Chazelas.
sumber
awk 'ORS=$NF~/\.$/?"\n":" "'
Dengan
awk
:Artinya, jangan tambahkan pemisah rekaman untuk setiap baris (ORS kosong). Tapi tambahkan pemisah rekaman sebelum baris saat ini jika tidak pada baris pertama dan baris saat ini tidak dimulai dengan huruf kecil. Sebaliknya, ganti karakter spasi sebagai gantinya, kecuali pada baris pertama.
sumber
And thisone issomehow, broken intomany.
saya tidak tahuawk
tetapi haruskah garis digabungkan dengan<space>
tambahanRS
? Atau apakah ini kesalahan pengguna?Dalam perl:
Secara teknis Anda ingin mengganti "baris baru diikuti dengan huruf kecil" dengan "spasi dan huruf kecil", yang merupakan inti dari skrip perl di atas:
input
.input
variabel untuk menjadi hasil pencarian & ganti operasi.sumber
perl -0777 -pe 's/\n([a-z])/ $1/g'
dan dapat juga dilakukan dengan GNU sed assed -zE 's/\n([a-z])/ \1/g'
(dengan asumsi input tidak memiliki karakter nol)perl -Mopen=locale -0777 -pe 's/\n(?=[[:lower:]])/ /g'
agar tidak terbatas pada surat ASCII.Dengan
sed
Anda dapat menggunakanN;P;D
siklus (sehingga selalu memiliki dua baris dalam ruang pola dan jika karakter pertama setelah baris baru adalah huruf kecil kemudian ganti baris baru dengan spasi) dant
est - cara itu setelah setiaps
ubstitusi Anda memulai kembali siklus:sumber
N;P;D
siklus bekerja di sini sehingga saya tidak akan membahasnya lagi. Perbedaannya di sini adalaht
est - untuk memeriksa apakah sesuatu telah diganti atau tidak - jika tes berhasil maka kita bercabang ke bagian atas skrip, jika tidak berarti tidak ada yang diganti danP;D
dieksekusi. Beri tahu saya jika masih belum jelas.Menggunakan
sed
danfmt
:Skrip sed menyisipkan baris baru sebelum setiap baris yang dimulai dengan huruf kapital (kecuali untuk baris input pertama).
sed
Keluaran kemudian disalurkan kefmt
untuk memformat ulang paragraf yang dihasilkan.Atau gunakan
par
jika Anda sudah menginstalnya. Ini adalah pembaru paragraf lain, tetapi jauh lebih mampu daripadafmt
, dengan lebih banyak fitur dan opsi.Perhatikan bahwa akan ada garis kosong antara setiap paragraf. Paragraf harus dipisahkan satu sama lain dengan setidaknya satu baris kosong. Tanpa baris kosong, seluruh sampel input Anda diformat ulang sebagai paragraf multi-kalimat tunggal, misalnya:
Jika Anda perlu menghapus garis-garis kosong setelah memformat ulang hanya pipa melalui
sed
lagi - tetapi ini akan menghapus SEMUA garis-garis kosong, termasuk yang mungkin ada di input asli. misalnyasumber
Cara lain yang dapat Anda lakukan adalah:
dimana:
$\
=>ORS
,$/
=>IRS
=\n
,$"
=space
sumber
Python 3
Ini adalah regex / substitusi yang sama dengan jawaban Jeff
sumber