Rimuovere i caratteri di fine riga da stdout? Più righe in un'unica riga


14

Ho uno script che produce il seguente testo. Questo è l'output di un modem ADSL2 Netopia 2210-02 .

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

Come posso rimuovere il carattere di fine riga per ogni riga? Vorrei che l'output fosse simile a questo (Sì, è brutto):

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 

Ho provato alcune soluzioni come questa, ma non funzionano:

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

Ho anche provato a usare tr. Mi aspettavo il seguente comando per sostituire ogni carattere di nuova riga con il carattere di spazio. Ciò prenderebbe le linee multiple e le combinerebbe in un'unica lunga linea. Invece, mostra solo l'ultima riga di output. Sembra sovrascrivere ogni riga successiva con la riga successiva di output.

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

Aggiornamento :

Dopo un ulteriore esame, sembra che ogni riga sia preceduta da un carattere di ritorno. Questo si presenta come ^Mquando si usa less. Quindi, ho aggiunto due trdichiarazioni. Uno per eliminare i caratteri di nuova riga, uno per eliminare il carattere di ritorno.

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

Risposte:


18

sednon funzionerà (facilmente) perché opera sulle linee una alla volta; potresti farlo, ma implicherebbe la copia dell'intero input nel buffer di conservazione

trin realtà dovrebbe funzionare nel modo in cui l'hai incollato; sei sicuro che le newline siano \ns? Puoi semplificarlo un po 'eliminando le nuove righe invece di convertirle in spazi:

tr -d '\n'

Entrambi tr '\n' ' 'e tr -d '\n' avvolgeranno la linea in un modo strano. Ho aggiornato la mia domanda per mostrare i risultati. Quindi, forse ho bisogno di usare tr, ma ho solo bisogno di capire come usare usarlo correttamente.
Stefan Lasiewski,

Potresti espandere ciò che è strano al riguardo? Il motivo per cui il tuo prompt sta finendo sulla stessa riga dell'ultima riga di output è proprio perché hai rimosso '\ n' alla fine della riga. Se descrivi il risultato finale che stai cercando, sono sicuro che qualcuno troverà il filtro appropriato.
Steven D,

Ok, immagino di poter essere più chiaro. Speravo di racchiudere queste righe multiple in un'unica riga. Mi aspetterei tr '\n' ' 'di rimuovere il carattere di nuova riga e sostituirlo con un carattere di spazio e quindi avere una linea lunga.
Stefan Lasiewski,

@Steven: ho aggiornato la mia domanda per discutere di ciò che mi aspettavo di vedere e di ciò che era effettivamente stampato sullo schermo.
Stefan Lasiewski,

Hmm. A meno che l'output non sia terminato con \ n, questo dovrebbe darti l'output che ti aspetti. Hai provato a reindirizzarlo in un file e poi confermare che il ritorno a capo non è qualcosa che il tuo termine sta facendo per te?
Steven D,

5

inoltre tr, puoi usare altri metodi

awk

awk '1' ORS= file

conchiglia

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

sed

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

0

Utilizzare tr -s '\n'per sostituire le sequenze di caratteri ripetuti di nuova riga con una singola occorrenza di nuova riga.

Esempio:

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

(vedi man tr)


0

Per rimuovere i caratteri di nuova riga, lo è tr -d '\n' < file. Tuttavia, per unire tutte le linee, questo è paste -sd '\0' file.

tr -d '\n' produce un output non testuale in quanto non termina una riga con un carattere di nuova riga.

Per rimuovere tutti i caratteri CR, puoi fare:

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

Per rimuovere solo i caratteri CR che si trovano alla fine delle righe:

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

O usa awkper tutto:

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

Oppure usa dos2unix(che rimuove quei CR finali e risolve anche altri problemi con i file di testo dai sistemi operativi Microsoft):

 dos2unix < file | paste -sd '\0' -
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.