Memproses teks, saya harus menghapus karakter baris baru setiap dua baris.
Contoh teks:
this is line one
and this is line two
the third and the
fourth must be pasted too
Output yang diinginkan:
this is line one and this is line two
the third and the fourth must be pasted too
Saya mencoba while
loop, tetapi loop sementara adalah praktik buruk. Apakah mungkin untuk melakukannya menggunakan tr
perintah lain?
text-processing
Tomaweb
sumber
sumber
Jawaban:
paste
(juga utilitas sederhana POSIX standartr
) adalah alat Anda untuk itu.Dengan asumsi Anda ingin karakter baris baru diganti dengan spasi alih-alih hanya dihapus seperti pada sampel Anda:
Atau:
Ganti
' '
dengan'\0'
jika Anda memang ingin mereka dihapus.Untuk mengganti 2 dari 3:
1 dari 3, dimulai dengan yang kedua:
Dan seterusnya.
Hal baik lainnya
paste
adalah bahwa ia tidak akan meninggalkan garis tanpa putus. Misalnya, jika Anda menghapus setiap baris baru dalam file (seperti dengantr -d '\n' < file
atautr '\n' ' ' < file
), Anda berakhir tanpa baris sama sekali karena baris harus diakhiri dengan karakter baris baru. Jadi, biasanya lebih baik menggunakanpaste
untuk itu (seperti dalampaste -sd '\0' file
ataupaste -sd ' ' file
) yang akan menambahkan karakter garis baru yang diperlukan untuk memiliki teks yang valid.sumber
Dengan sed GNU modern
Dan awk
sumber
sed
pendekatan cara menyeruput seluruh file dalam memori (asalkan tidak mengandung NUL byte) dan melakukan beberapa substitusi regexp mahal. Saya tidak bisa melihat manfaatnya darised 'N;s/\n/ /'
pendekatan standar .Gunakan
sed
untuk ini seperti yang ditunjukkan di bawah ini:sumber
Cara lain adalah dengan menggunakan
xargs
:dimana
Meskipun, solusi ini cukup berlebihan karena
echo
proses dieksekusi untuk setiap baris ... Jadi, selain contoh mainan, solusi berdasarkan awk / sed atau serupa harus lebih disukai.sumber
echo
implementasi Anda, Anda juga akan memiliki masalah dengan karakter backslash atau beberapa baris yang dimulai dengan-
(suka--help
atau-nene
dengan GNUecho
). Perhatikan juga bahwa itu-d
adalah ekstensi GNU.echo
, Anda dapat menggunakan ini:< txt xargs -d '\n' -n 2 printf -- '%s %s\n'
Ini sebenarnya sangat sederhana di vim. Untuk bergabung dengan setiap baris gunakan
J
perintah, lalu gunakan%norm
perintah untuk menerapkannya ke setiap baris secara bersamaan. Sebagai contoh(Kalau-kalau Anda tidak terbiasa dengan vim,
<CR>
cukup masukkan saja)Ini bahkan berfungsi untuk bergabung dengan sejumlah garis acak. Misalnya, untuk bergabung setiap sepuluh baris akan
Jika Anda merasa tidak nyaman dengan vim, dan Anda lebih suka menggunakannya sebagai alat baris perintah, daripada editor teks interaktif, Anda bisa melakukannya:
sumber
Ini mencetak setiap baris,,
$0
diikuti oleh spasi atau baris baru tergantung pada apakah nomor barisNR
,, ganjil atau genap.Ekspresi
NR%2?" ":"\n"
adalah pernyataan terner. EkspresiNR%2
bernilai true (bukan nol) jika nomor barisnya ganjil. Dalam kasus ini, ekspresi ternary mengembalikan spasi. Jika itu bernilai false (nol), maka baris baru dikembalikan.Alternatif
Seperti yang disarankan oleh Costas di komentar:
Di sini, pernyataan ternary
NR%2?" ":RS
digunakan untuk mengembalikan spasi atau pemisah rekaman input (RS
, default = baris baru). Nilai ini ditugaskan untuk pemisah catatan keluaranORS
,. Di1
akhir perintah adalah singkatan cryptic awk untuk print-the-record.sumber
()
tanda kurung dan spasi setelahprintf
;)'NR%2{printf("%s ",$0);next}1'
'{ORS=(NR%2?" ":RS)}1'
ORS
solusi.Solusi generik, ganti
5
dengan jumlah garis yang dibutuhkansumber
Anda dapat menggunakan
awk
ini:Itu menghasilkan:
dimana:
The
awk
tindakan dijalankan untuk setiap baris, variabel khusus$0
referensi baris saat ini,NR
adalah nomor baris saat ini (mulai dari 1). Tindakan kedua dijaga oleh ekspresiNR%2
, yang merupakan operasi modulo. Dengan demikian,c=" "
hanya dieksekusi jikaNR%2
benar, yaitu untuk nomor garis ganjil.The
awk
sintaks C seperti, tapi beberapa elemen adalah opsional dalam beberapa konteks - misalnya titik koma.sumber
c
Variabel Anda adalahORS
:'NR%2{ORS=" "}1;{ORS=RS}'
Menggunakan
ed
:The
ed
perintah mengedit akan, untuk setiap baris (g
berlaku satu set mengedit perintah untuk setiap baris yang cocok ekspresi reguler yang diberikan), menambahkan karakter ruang untuk akhir dan bergabung dengan baris berikutnya. Kemudian ia menulis teks yang dihasilkan ke file bernamatext.new
.sumber
Dengan Ruby.
Saya berasumsi setiap blok
n
garis harus digabungkan. Misalkann = 3
, file input adalah'infile'
dan hasilnya ditulis ke file'outfile'
.Bangun file
Konfirmasikan konten file
Hapus baris baru dan tulis ke file
Konfirmasikan konten
sumber
ruby
luar topik tentang U&L. Tapi, karena Anda menggunakannya dari baris perintah denganruby -e
, itu membuatnya cukup pada topik.