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.