Hapus karakter garis akhir dari stdout? Banyak baris menjadi satu baris

14

Saya memiliki skrip yang menampilkan teks berikut. Ini adalah output dari modem Netopia 2210-02 ADSL2 .

ADSL Line State:        Up
ADSL Startup Attempts:  1
ADSL Modulation:        DMT
ADSL Data Path:         Fast
Datapump Version:       DSP 7.2.3.0, HAL 7.2.1.0
SNR Margin:                   8.20        9.00 dB
Line Attenuation:            57.50       31.00 dB
Output Power:                17.09       12.34 dBm
Errored Seconds:                 0           0
Loss of Signal:                  0         476
Loss of Frame:                   0           0
CRC Errors:                  57921         416
Data Rate:                    2880        1024

Bagaimana saya bisa menghapus karakter end-of-line untuk setiap baris? Saya ingin output terlihat seperti ini (Ya jelek):

ADSL Line State:        Up ADSL Startup Attempts:  1 ADSL Modulation:        DMT ADSL Data Path:         Fast Datapump Version:       DSP 7.2.3.0, HAL 7.2.1.0 SNR Margin:                   8.20        9.00 dB Line Attenuation:            57.50       31.00 dB Output Power:                17.09       12.34 dBm Errored Seconds:                 0           0 Loss of Signal:                  0         476 Loss of Frame:                   0           0 CRC Errors:                  57921         416 Data Rate:                    2880        1024 

Saya mencoba beberapa solusi seperti ini, tetapi mereka tidak berhasil:

# (This simply outputs the contents of the script, unmodified)
stefanl@hosta:~/Work/Cacti $ ./script | sed -e 's/$//'

Saya juga mencoba menggunakan tr. Saya mengharapkan perintah berikut untuk mengganti setiap karakter baris baru dengan karakter spasi. Ini akan mengambil banyak garis dan menggabungkannya menjadi satu garis panjang. Sebaliknya, ini hanya menampilkan garis keluaran terakhir. Tampaknya untuk menimpa setiap baris berikutnya dengan garis output berikutnya.

stefanl@hosta:~/Work/Cacti $ ./script | tr '\n' ' '
Data Rate:                    2880        1024stefanl@hosta:~/Work/Cacti $
stefanl@hosta:~/Work/Cacti $

Perbarui :

Setelah pemeriksaan lebih lanjut, sepertinya setiap baris didahului oleh karakter kembali. Ini muncul ^Msaat menggunakan less. Jadi, saya menambahkan dua trpernyataan. Satu untuk menghapus karakter baris baru, satu untuk menghapus karakter kembali.

./script | | tr -d '\n' | tr -d '\r'
Stefan Lasiewski
sumber

Jawaban:

18

sedtidak akan bekerja (dengan mudah) karena beroperasi pada saluran satu per satu; Anda bisa melakukannya, tetapi itu akan melibatkan menyalin seluruh input ke buffer penahan

trsebenarnya harus bekerja dengan cara Anda menempelkannya; Anda yakin baris baru \ns? Anda dapat menyederhanakannya sedikit dengan menghapus baris baru alih-alih mengubahnya menjadi spasi:

tr -d '\n'
Michael Mrozek
sumber
Keduanya tr '\n' ' 'dan tr -d '\n' akan membungkus garis dengan cara yang aneh. Saya memperbarui pertanyaan saya untuk menunjukkan hasilnya. Jadi, mungkin saya perlu menggunakan tr, tapi saya hanya perlu mencari tahu bagaimana menggunakannya dengan benar.
Stefan Lasiewski
Bisakah Anda memperluas apa yang aneh tentangnya? Alasan prompt Anda berakhir di baris yang sama dengan baris terakhir dari output adalah tepat karena Anda telah menghapus '\ n' di akhir baris. Jika Anda menggambarkan hasil akhir yang Anda tuju, saya yakin seseorang akan menemukan filter yang sesuai.
Steven D
Ok, saya kira saya bisa lebih jelas. Saya berharap untuk membungkus beberapa baris ini menjadi satu baris. Saya berharap tr '\n' ' 'untuk menghapus karakter baris baru dan menggantinya dengan karakter spasi, dan karenanya memiliki satu garis panjang.
Stefan Lasiewski
@ Seven: Saya memperbarui pertanyaan saya untuk membahas apa yang saya harapkan untuk dilihat, dan apa yang sebenarnya dicetak ke layar.
Stefan Lasiewski
Hmm. Kecuali jika output Anda tidak berakhir dengan \ n ini akan memberi Anda output yang Anda harapkan. Sudahkah Anda mencoba memipisnya menjadi file dan kemudian mengonfirmasi bahwa pembungkus baris bukanlah sesuatu yang dilakukan istilah Anda untuk Anda?
Steven D
5

selain itu tr, beberapa metode lain dapat Anda gunakan

awk

awk '1' ORS= file

kulit

while read -r line; do printf "%s " "$line"; done <file

sed

sed -e ':a' -e 'N;s/\n/ /;ba' file
pengguna1606
sumber
0

Gunakan tr -s '\n'untuk mengganti urutan karakter baris baru yang diulang dengan kejadian baris baru.

Contoh:

>>> echo -e "Squeeze\n\n\nthose\n\n\n\nnewlines\n"
Squeeze


those



newlines

2z [franck:~] $ 
>>> echo -e "Squeeze\n\n\nthose\n\n\n\nnewlines\n" | tr -s '\n'
Squeeze
those
newlines

(lihat man tr)

Franck
sumber
0

Untuk menghapus karakter baris baru, itu tr -d '\n' < file. Namun, untuk bergabung dengan semua lini, itu paste -sd '\0' file.

tr -d '\n' menghasilkan output non-teks karena tidak mengakhiri satu baris dengan karakter baris baru.

Untuk menghapus, semua karakter CR, Anda dapat melakukan:

tr -d '\r' < file | paste -sd '\0' -

Untuk hanya menghapus karakter CR yang ada di akhir baris:

CR=$(printf '\r')
sed "s/$CR\$//" < file | paste -sd '\0' -

Atau gunakan awkuntuk semuanya:

awk '{gsub(/\r$/, ""); printf "%s", $0} 
     END {if (NR) print ""}' < file

Atau gunakan dos2unix(yang akan menghapus CR yang mengekor dan juga memperbaiki beberapa masalah lain dengan file teks dari Microsoft OS):

 dos2unix < file | paste -sd '\0' -
Stéphane Chazelas
sumber