$ awk 'length > 72' {HOW TO PRINT THE LINEs IN PCS?} msg
yaitu saya ingin menambahkan \n
setelah 72 karakter dan melanjutkan, jadi pada awalnya Anda mungkin perlu menghapus semua \n
s dan menambahkannya. Mungkin lebih mudah lebih mudah dengan alat lain tetapi mari kita coba untuk awk.
[Memperbarui]
Williamson memberikan jawaban yang benar tetapi perlu bantuan untuk membacanya. Saya memecah masalah menjadi beberapa bagian dengan contoh sederhana, di bawah ini.
Mengapa kode di bawah ini mencetak
\t
dalam kedua kasus,gsub
harus menggantikan barang? x adalah file dummy, beberapa 0 aneh di akhir.Menyerang garis
line = $0 \n more = getline \n gsub("\t"," ")
di balasan Williamson ,line
tampaknya mendapat stdout seluruh saatmore
mendapat nilai muncul$0
, kan?
Kode ke bagian 1
$ gawk '{ hallo="tjena\t tjena2"; gsub("\t"," "); }; END {print hallo; gsub("\t", ""); hallo=hallo gsub("\t",""); print hallo }' x
tjena tjena2
tjena tjena20
sumber
Tidak menggunakan awk
Saya mengerti ini mungkin hanya salah satu bagian dari masalah yang lebih besar yang Anda coba pecahkan menggunakan
awk
atau hanya upaya untuk memahami awk lebih baik, tetapi jika Anda benar-benar hanya ingin menjaga panjang garis Anda menjadi 72 kolom, ada alat yang jauh lebih baik.The
fmt
alat dirancang dengan khusus ini dalam pikiran:fmt
juga akan berusaha keras untuk memecahkan garis di tempat-tempat yang wajar, membuat output lebih bagus untuk dibaca. Lihatinfo
halaman untuk detail lebih lanjut tentang apa yangfmt
dianggap "tempat yang masuk akal."sumber
width
berarti byte, bukan karakter.fold -s -w 72
fold
akan bekerja pada sistem GNU (dilengkapi dengan GNUcoreutils
).Awk adalah bahasa Turing-lengkap, dan bukan yang sangat membingungkan, jadi cukup mudah untuk memotong garis. Berikut adalah versi imperatif langsung.
Jika Anda ingin memotong garis di antara kata-kata, Anda dapat membuat kode dalam awk, tetapi mengenali kata-kata adalah hal yang tidak sepele (karena alasan lebih banyak berhubungan dengan bahasa alami daripada kesulitan algoritmik). Banyak sistem memiliki utilitas yang disebut
fmt
yang tidak hanya itu.sumber
Berikut adalah fungsi Awk yang memecah spasi:
Anehnya ini lebih performan daripada lipat atau fmt .
Sumber
sumber
Anda bertanya mengapa
awk
kode tersebut memancarkan tab dan dari mana nol berasal.Kode tidak mengubah
hello
string dengangsub()
panggilan. Dengan dua argumen,gsub()
bertindaklah$0
. Untuk benar-benar memodifikasihallo
variabel, gunakangsub(..., ..., hallo)
.Anda mendapatkan nol di akhir string karena
gsub()
mengembalikan jumlah pergantian yang dibuat, dan pada satu titik Anda menambahkan nomor ini ke nilaihallo
.Saya mengetahui setidaknya tiga utilitas yang khusus untuk membungkus dan memformat paragraf teks:
fold
, "filter untuk garis lipat", yang merupakan utilitas POSIX standar . Itu hanya menyisipkan baris baru dan tidak merefleksikan teks.fmt
, "pemformat teks sederhana", yang juga sering dipasang pada sistem Unix secara default dan sedikit lebih pintar daripadafold
ketika harus merefleksikan paragraf.par
, " filter untuk memformat ulang paragraf ", yang memiliki kemampuan tambahan untuk mendeteksi awalan paragraf dan sufiks (seperti teks dengan kotak ASCII di sekitarnya, atau komentar dalam sedikit kode sumber), dan menangani lekukan dan lekukan indentasi agak lebih baik darifmt
.sumber
Menggunakan gensub, untuk mendapatkan
fold
semantik, Anda bisa menjalankan sesuatu di sepanjang barissumber