Satır sonu karakterleri stdout'tan kaldırılsın mı? Tek bir satıra birden fazla satır


14

Aşağıdaki metni çıktısı bir komut dosyası var. Bu bir Netopia 2210-02 ADSL2 modemin çıkışıdır .

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

Her satır için satır sonu karakterini nasıl kaldırabilirim? Çıktı böyle bir şey görünmesini istiyorum (Evet bu çirkin):

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 

Bunun gibi bazı çözümler denedim, ama çalışmıyorlar:

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

Ben de kullanmayı denedim tr. Her satır karakteri yerine boşluk karakteri koymak için aşağıdaki komutu bekliyordum. Bu, birden çok satırı alıp tek bir uzun satırda birleştirir. Bunun yerine, bu yalnızca son çıktı satırını görüntüler. Sonraki her satırın bir sonraki çıktı satırının üzerine yazıldığı anlaşılıyor.

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

Güncelleme :

Daha fazla incelemede, her satırın önünde bir dönüş karakteri varmış gibi görünüyor. Bu, ^Mkullanırken olduğu gibi görünür less. Bu yüzden iki trifade ekledim . Biri yeni satır karakterlerini silmek, diğeri de dönüş karakterini silmek için.

./script | | tr -d '\n' | tr -d '\r'

Yanıtlar:


18

sed(kolayca) çalışmaz, çünkü her seferinde bir hat üzerinde çalışır; bunu yapabilirsiniz, ancak tüm girdiyi tutma arabelleğine kopyalamayı içerir

traslında yapıştırdığınız şekilde çalışmalı; yeni satırların \ns olduğundan emin misiniz ? Yeni satırları boşluklara dönüştürmek yerine silerek biraz basitleştirebilirsiniz:

tr -d '\n'

Her ikisi de tr '\n' ' 've tr -d '\n' hattı tuhaf bir şekilde sarar. Sonuçları göstermek için sorumu güncelledim. Yani, belki kullanmam gerekiyor tr, ama sadece nasıl kullanacağımı doğru bir şekilde kullanmam gerekiyor.
Stefan Lasiewski

Garip olanı genişletebilir misin? İsteminizin son çıktı satırı ile aynı satırda bitmesinin nedeni, satırın sonundaki '\ n' yi kaldırmış olmanızdır. İstediğiniz sonucu açıklarsanız, eminim birileri uygun filtreyi bulur.
Steven D

Tamam, sanırım daha açık olabilirdim. Bu birden çok satırı tek bir satıra sarmayı umuyordum. tr '\n' ' 'Newline karakterini kaldırmayı ve bir boşluk karakteriyle değiştirmeyi beklerim ve bu nedenle uzun bir çizgiye sahip olurum .
Stefan Lasiewski

@Steven: Ne görmeyi beklediğimi ve aslında neyin ekrana yazdırıldığını tartışmak için sorumu güncelledim.
Stefan Lasiewski

Hmm. Çıktınız \ n'lerle bitmediği sürece, bu beklediğiniz çıktıyı vermelidir. Bir dosyaya aktarmayı denedikten sonra satır kaydırmanın terimin sizin için yaptığı bir şey olmadığını doğruladınız mı?
Steven D

5

ayrıca trkullanabileceğiniz diğer yöntemler

awk

awk '1' ORS= file

kabuk

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

sed

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

0

tr -s '\n'Tekrarlanan satırsonu karakter dizilerini tek satırsonu yerine koymak için kullanın .

Misal:

>>> 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

(bakınız man tr)


0

Yeni satır karakterlerini kaldırmak için kullanılır tr -d '\n' < file. Ancak, tüm çizgilere katılmak için, bu paste -sd '\0' file.

tr -d '\n' yeni satır karakteri olan bir satırı sonlandırmadığından metin dışı çıktı üretir.

Tüm CR karakterlerini kaldırmak için şunları yapabilirsiniz:

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

Yalnızca satırların sonundaki CR karakterlerini kaldırmak için:

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

Veya awkher şey için kullanın :

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

Veya dos2unix(bu sondaki CR'leri kaldıracak ve Microsoft OS'lerde metin dosyalarıyla ilgili diğer bazı sorunları çözecek):

 dos2unix < file | paste -sd '\0' -
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.