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