Apakah ada masalah dengan karakter baris sed dan baru?
Saya punya file test.txt dengan konten berikut
aaaaa
bbbbb
ccccc
ddddd
Berikut ini tidak berfungsi:
sed -r -i 's/\n/,/g' test.txt
Saya tahu bahwa saya dapat menggunakan tr
ini tetapi pertanyaan saya adalah mengapa sepertinya tidak mungkin dengan sed.
Jika ini adalah efek samping dari pemrosesan file baris demi baris saya akan tertarik mengapa ini terjadi. Saya pikir grep
menghapus baris baru. Apakah sed melakukan hal yang sama?
tr
akan menambahkan trailing,
dan akan menampilkan garis yang tidak tertentu. Yang terbaik adalah menggunakanpaste
:paste -sd , test.txt
Jawaban:
Dengan GNU
sed
dan yang disediakanPOSIXLY_CORRECT
tidak di lingkungan (untuk input single-line):Dari https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n :
:a
N
$!ba
($!
berarti tidak melakukannya di baris terakhir (karena harus ada satu baris terakhir)).sumber
ba: Event not found
sed
perintah di atas dengan opsi yang tepat? Padatest.txt
file apa ? Dengan versised
(cobased --version
) yang mana?!
. Menariknya, itu masih tidak berhasil untuk saya dan saya akhirnya harus meloloskan diri dari naskah!
saya.csh
. Jadi saya tidak benar-benar memiliki masalah saat ini, tetapi Anda tahu mengapa itu terjadi? Apa yang berhasil untuk saya adalahsed :a;N;$\\!ba;s/\n/ /g'
Ini bekerja dengan GNU
sed
:-z
sudah termasuk sejak 4.2.2NB.
-z
mengubah pembatas menjadi karakter nol (\0
). Jika input Anda tidak mengandung karakter nol, seluruh input diperlakukan sebagai satu baris. Ini bisa datang dengan keterbatasannya .Untuk menghindari penggantian baris baru dari baris terakhir, Anda dapat mengubahnya kembali:
(Yang merupakan
sed
sintaksis GNU lagi, tetapi tidak masalah karena semuanya hanya GNU)sumber
Dari situs web Oracle:
Pada dasarnya ini berarti bahwa karena sed membaca baris demi baris, karakter baris baru tidak cocok.
Solusi dari https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n adalah:
atau, dalam versi portabel (tanpa
;
menggabungkan setelah label tanda melompat)Penjelasan tentang cara kerjanya disediakan pada halaman itu.
sumber
sed
, jika POSIXLY_CORRECT berada di lingkungan dan input hanya memiliki satu baris, tidak akan ada output.sed
selalu menghapus garis akhir trailing\n
tepat sebelum mengisi ruang pola, dan kemudian menambahkan satu sebelum menuliskan hasil skripnya. Sebuah\n
ewline dapat dimiliki dalam pola-ruang dengan berbagai cara - tetapi tidak pernah jika itu bukan hasil edit. Ini penting -\n
garis utama dalamsed
ruang pola selalu mencerminkan perubahan, dan tidak pernah terjadi di aliran input.\n
ewlines adalah satu-satunya pembatas yangsed
dapat diandalkan oleh der dengan input yang tidak diketahui.Jika Anda ingin mengganti semua
\n
ewline dengan koma dan file Anda tidak terlalu besar, maka Anda dapat melakukannya:Itu menambahkan setiap baris input ke
h
ruang lama - kecuali yang pertama, yang alih-alih menimpah
ruang lama - mengikuti\n
karakter ewline. Kemudiand
menghapus setiap baris bukan yang$!
terakhir dari output. Pada baris terakhirH
, ruang lama dan polax
diubah dan semua\n
karakter ewliney///
diterjemahkan ke koma.Untuk file besar hal semacam ini pasti akan menyebabkan masalah -
sed
buffer pada batas-garis, yang dapat dengan mudah dipenuhi dengan tindakan semacam ini.sumber
Atau, Anda dapat menggunakan sintaks yang sedikit lebih sederhana:
... hanya mengubah urutan urutan.
sumber
s
perintah untuk setiap jalur input pada ruang pola yang semakin besar.Ada beberapa sihir sed yang sangat bagus di sini. Dan beberapa poin bagus tentang ruang pola meluap. Saya suka menggunakan sed bahkan ketika itu bukan cara yang paling sederhana, karena sangat kompak dan kuat. Namun memiliki keterbatasan, dan untuk sejumlah besar data, ruang pola harus mahoosive.
GNU mengatakan ini:
Saya tidak punya banyak untuk ditambahkan, tapi saya ingin mengarahkan Anda ke panduan masuk saya untuk sed . Ini luar biasa. http://www.grymoire.com/Unix/Sed.html
dan inilah solusi saya:
baik itu berhasil
sumber
Katakanlah Anda ingin mengganti baris baru dengan
\n
. Saya ingin melakukan itu, jadi inilah yang saya lakukan:Inilah fungsinya: untuk semua baris kecuali yang terakhir , tambahkan
\n
. Lalu, hapus baris baru dengantr
.sumber
-r
hanya tersedia di GNUsed
, bukan BSD.