Zeilenendezeichen aus stdout entfernen? Mehrere Zeilen in eine einzelne Zeile

12

Ich habe ein Skript, das den folgenden Text ausgibt. Dies ist die Ausgabe eines Netopia 2210-02 ADSL2- Modems.

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

Wie kann ich das Zeilenendezeichen für jede Zeile entfernen? Ich möchte, dass die Ausgabe so aussieht (Ja, es ist hässlich):

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 

Ich habe einige Lösungen wie diese ausprobiert, aber sie funktionieren nicht:

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

Ich habe auch versucht mit tr. Ich hatte erwartet, dass der folgende Befehl jedes Zeilenumbruchzeichen durch das Leerzeichen ersetzt. Dies würde die mehreren Zeilen nehmen und sie zu einer langen einzelnen Zeile kombinieren. Stattdessen wird nur die letzte Ausgabezeile angezeigt. Es scheint jede nachfolgende Zeile mit der nächsten Ausgabezeile zu überschreiben.

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

Update :

Bei weiterer Prüfung sieht es so aus, als ob jeder Zeile ein Rückkehrzeichen vorangestellt ist. Dies zeigt sich wie ^Mbei der Verwendung less. Also habe ich zwei trAussagen hinzugefügt . Eines zum Löschen von Zeilenumbrüchen und eines zum Löschen des Rückgabewerts.

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

Antworten:

16

sedfunktioniert nicht (leicht), weil es auf einer Linie nach der anderen arbeitet; Sie könnten es tun, aber es würde das Kopieren der gesamten Eingabe in den Haltepuffer beinhalten

trsollte eigentlich so funktionieren, wie Sie es eingefügt haben; Sind Sie sicher, dass die Zeilenumbrüche \ns sind? Sie können es ein wenig vereinfachen, indem Sie die Zeilenumbrüche löschen, anstatt sie in Leerzeichen umzuwandeln:

tr -d '\n'
Michael Mrozek
quelle
Beide tr '\n' ' 'und tr -d '\n' wickeln die Linie auf seltsame Weise. Ich habe meine Frage aktualisiert, um die Ergebnisse anzuzeigen. Vielleicht muss ich es benutzen tr, aber ich muss nur herausfinden, wie ich es richtig benutze.
Stefan Lasiewski
Könntest du etwas genauer erläutern, was daran seltsam ist? Der Grund, warum Ihre Eingabeaufforderung in derselben Zeile endet wie die letzte Ausgabezeile, ist genau, dass Sie das '\ n' am Ende der Zeile entfernt haben. Wenn Sie das Endergebnis beschreiben, nach dem Sie suchen, wird bestimmt jemand den passenden Filter finden.
Steven D
Ok, ich denke, ich könnte klarer sein. Ich hatte gehofft, diese mehreren Zeilen zu einer einzigen Zeile zusammenzufassen. Ich würde erwarten tr '\n' ' ', das Zeilenumbruchzeichen zu entfernen und es durch ein Leerzeichen zu ersetzen, und daher eine lange Zeile zu haben.
Stefan Lasiewski
@Steven: Ich habe meine Frage aktualisiert, um zu diskutieren, was ich erwartet hatte und was tatsächlich auf dem Bildschirm gedruckt wurde.
Stefan Lasiewski
Hmm. Sofern Ihre Ausgabe nicht mit \ n beendet wird, sollte dies die erwartete Ausgabe ergeben. Haben Sie versucht, es in eine Datei zu leiten und dann zu bestätigen, dass der Zeilenumbruch nichts ist, was Ihr Begriff für Sie tut?
Steven D
5

Außerdem treinige andere Methoden, die Sie verwenden können

awk

awk '1' ORS= file

Schale

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

sed

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

Verwendung tr -s '\n'Sequenzen von wiederholten Zeilenende- Zeichen zu ersetzen mit einem einzigen Auftreten Neuen - Zeile.

Beispiel:

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

(siehe man tr)

Franck
quelle
0

Zum Entfernen von Zeilenumbrüchen tr -d '\n' < file. Um jedoch alle Zeilen zu verbinden, ist das paste -sd '\0' file.

tr -d '\n' Erzeugt keine Textausgabe, da die eine Zeile nicht mit einem Zeilenumbruchzeichen abgeschlossen wird.

Um alle CR-Zeichen zu entfernen, haben Sie folgende Möglichkeiten:

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

So entfernen Sie nur die CR-Zeichen, die sich am Ende der Zeilen befinden:

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

Oder awkfür alles verwenden:

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

Oder verwenden Sie dos2unix:

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