web-dev-qa-db-fra.com

Supprimer la fin des caractères de la ligne de stdout? Plusieurs lignes en une seule ligne

J'ai un script qui génère le texte suivant. Il s'agit de la sortie d'un Netopia 2210-02 ADSL2 modem.

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

Comment puis-je supprimer le caractère de fin de ligne pour chaque ligne? J'aimerais que la sortie ressemble à quelque chose comme ça (oui c'est laid):

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 

J'ai essayé des solutions comme celle-ci, mais elles ne fonctionnent pas:

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

J'ai aussi essayé d'utiliser tr. Je m'attendais à ce que la commande suivante remplace chaque personnage nouveau avec le caractère spatial. Cela prendrait les multiples lignes et les combinerait en une seule ligne unique. Cela affiche plutôt la dernière ligne de sortie. Il semble écraser chaque ligne ultérieure avec la ligne de sortie suivante.

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

Mise à jour :

Lors de l'examen ultérieur, il semble que chaque ligne soit précédée d'un caractère de retour. Cela se présente comme ^M Lorsque vous utilisez less. Donc, j'ai ajouté deux déclarations tr. Un pour supprimer des caractèresWLINE, un pour supprimer le caractère de retour.

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

outre tr, d'autres méthodes que vous pouvez utiliser

maltraiter

awk '1' ORS= file

Coquille

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

sed

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

Pour supprimer les caractèresWLINE, c'est tr -d '\n' < file. Cependant, pour rejoindre toutes les lignes, c'est paste -sd '\0' file.

tr -d '\n' Produit une sortie non-texte car elle ne termine pas la ligne d'une ligne avec un caractère de nouvelle ligne.

Pour enlever, tous les caractères CR, vous pouvez faire:

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

Pour supprimer uniquement les caractères CR qui sont à la fin des lignes:

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

Ou utiliser awk pour tout:

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

Ou utiliser dos2unix (qui supprimerait ces CRS de fin et corrige également d'autres problèmes avec des fichiers texte de Microsoft OSES):

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