標準出力から行末文字を削除しますか?複数行を1行にマージ

標準出力から行末文字を削除しますか?複数行を1行にマージ

次のテキストを出力するスクリプトがあります。これは出力です。ネトピア 2210-02 ADSL2モデム。

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

各行の行末文字を削除する方法は?私は出力が次のようになりたいと思います(はい、見苦しいです):

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 

同様の解決策を試しましたが、うまくいきません。

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

私はまた、tr次のコマンドが各改行文字を空白文字に置き換えることを期待しました。これにより、複数の行が1つの長い1行にマージされます。代わりに、出力の最後の行だけが表示されます。各後続のラインを次の出力ラインで上書きするようです。

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

修正する:

詳しく見ると、各行の前に戻り文字が続くようです。を使用すると、これが表示^Mされますless。だから2つのtrドアを追加しました。 1つは改行を削除し、もう1つはキャリッジリターンを削除します。

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

答え1

sed一度に 1 行だけ実行するので (簡単に) 動作しませんが、それを行うには、入力全体を保持バッファにコピーする必要があります。

tr実際に貼り付けた方法で動作します。改行が\nsかどうかわかりますか?改行を空白に変換するのではなく、削除して単純化できます。

tr -d '\n'

答え2

それに加えて、tr他の方法を使用することもできます。

アッ

awk '1' ORS= file

シェル

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

sed

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

答え3

tr -s '\n'繰り返される改行文字シーケンスを単一の改行文字に置き換えるために使用されます。

例:

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

(望むよりman tr

答え4

改行を削除するにはtr -d '\n' < file。ただし、すべての行をリンクする必要がありますpaste -sd '\0' file

tr -d '\n'改行文字で行を終了しないため、テキストではなく出力を生成します。

すべてのCR文字を削除するには、次のようにします。

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

行末のCR文字のみを削除します。

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

またはすべてawkについて:

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

または、次の方法を使用しますdos2unix(これにより、後続のCRが削除され、Microsoftオペレーティングシステムのテキストファイルに関連する他のいくつかの問題が解決されます)。

 dos2unix < file | paste -sd '\0' -

関連情報