Ingin agar setiap baris dalam file diulang beberapa kali.
mis. minta setiap baris diulang empat kali:
a
b
c
menjadi:
a
a
a
a
b
b
b
b
c
c
c
c
Saya telah melakukan beberapa pencarian, dan ada banyak pertanyaan dan jawaban di sepanjang baris melakukan kebalikan, misalnya menggabungkan garis duplikat menjadi garis tunggal, dan mungkin beberapa tentang menggandakan garis dengan mencetaknya lagi.
Akan mudah untuk melakukan ini di C, tapi saya berharap saya tahu lebih banyak tentang perintah asli sehingga saya tidak perlu menggunakan jenis-jenis lemparan-sekali saja sepanjang waktu.
text-processing
sed
awk
perl
Yimin Rong
sumber
sumber
awk
'sfor
tidak perlu kawat gigi jika hanya ada satu perintah untuk mengulang. Danperl
lebih sederhana jika Anda menggunakanforeach
lingkaran:for$i(0..3){print}
.perl -ne 'print(($_)x4)'
. Juga, Anda harus mengutip$line
(dalam gema) di versi bash Anda.BEGIN { ORS="\r\n" }
Saya ingin tahu apakah ini berubah menjadi pertandingan golf :
Penjelasan:
p
Perintah sed adalah untuk mencetak baris saat ini. Perilaku default adalah untuk mencetak baris saat ini sebelum pindah ke baris berikutnya (itu sebabnya-n
Anda harus mematikannya). Beberapa seds yang lebih tua tidak memiliki titik koma (saya pikir) sehingga mungkin Anda harus melakukannyased -e p -e p -e p
Awk bekerja dengan
condition {action}
pasangan. Jika tindakan dihilangkan, standarnya adalah untuk mencetak baris saat ini jika kondisi kembali benar. Awk, seperti banyak bahasa mirip-C, memperlakukan1
sebagai benar. (Untuk kelengkapan, jika kondisi dihilangkan, tindakan akan dieksekusi untuk setiap catatan.)Banyak fungsi perl memanfaatkan variabel "default". Lapisan satu ini setara dengan (pada perl 5.16):
sumber
1
dilakukan di awk? Singkatan untukprint $0
?1
(benar); blok default setara dengan{print}
. Jadi pernyataan1
itu berarti mencetak buffer baris saat ini ({print}
). ({print}
dan{print $0}
sebagian besar sama, qed.)sed
yang tidak mendukung titik koma sebagai terminator perintah; apakah memang ada yang seperti itu?sumber
Anda dapat melakukan ini tanpa memerlukan
sed
,perl
atauawk
.atau menggunakan loop sementara:
Contohnya
untuk loop sementara lingkaransumber
Menggunakan shell murni:
sumber
--help
sebagai string dan bukan opsi? [pertimbangkan kasus di manaline
ada--help
atau pilihan lain]yes -- --help
yes
danhead
berarti ini bukan "murni shell"Ini mungkin bekerja untuk Anda (sed GNU):
Akan mengulangi setiap baris 4 kali.
Atau jika Anda lebih suka:
Di mana Anda mengulangi setiap baris 3 kali lagi.
sumber
@potong jawaban tidak bekerja dengan baris kosong, ganti
\+
dengan*
harus memperbaikinya:sumber