stdoutから行末文字を削除しますか?複数の行を単一の行に


14

次のテキストを出力するスクリプトがあります。これは、Netopia 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つの長い単一行に結合します。代わりに、これは出力の最後の行のみを表示します。後続の各行を次の出力行で上書きするようです。

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'

回答:


18

sed一度に1行ずつ動作するため、(簡単に)動作しません。あなたはそれを行うことができますが、それは入力全体をホールドバッファにコピーすることを伴います

tr実際に貼り付けた方法で動作するはずです。改行が\nsであると確信していますか?改行をスペースに変換する代わりに削除することで、それを少し単純化できます。

tr -d '\n'

どちらtr '\n' ' 'tr -d '\n' 奇妙な方法で行をラップします。結果を表示するために質問を更新しました。したがって、多分私はを使用する必要がありますがtr、それを適切に使用する方法を理解する必要があります。
ステファンLasiewski

それについて奇妙なことを展開していただけますか?出力の最後の行と同じ行にプロンプ​​トが表示される理由は、行の末尾の「\ n」を削除したためです。目的の最終結果を説明していただければ、誰かが適切なフィルターを思い付くでしょう。
スティーブンD

わかりました、もっと明確にできると思います。これらの複数の行を1行に折り返したいと思っていました。私は期待tr '\n' ' '改行文字を削除し、空白文字で置き換え、したがって、一つの長い行を持っています。
ステファンLasiewski

@Steven:私は質問を更新して、見たいと思っていたこと、実際に画面に印刷されたものについて議論しました。
ステファンLasiewski

うーん。出力が\ nで終わらない限り、これは期待する出力を提供するはずです。それをファイルにパイピングし、行の折り返しがあなたの用語があなたのためにやっていることではないことを確認しましたか?
スティーブンD

5

さらにtr、あなたが使用できるいくつかの他の方法

awk

awk '1' ORS= file

シェル

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

sed

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

0

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


0

改行文字を削除するには、tr -d '\n' < fileです。ただし、すべての行を結合するのは、ですpaste -sd '\0' file

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

すべての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 OSのテキストファイルに関するその他の問題も修正します)。

 dos2unix < file | paste -sd '\0' -
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.