it-swarm-ja.tech

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

次のテキストを出力するスクリプトがあります。これは 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)
[email protected]:~/Work/Cacti $ ./script | sed -e 's/$//'

trも使用してみました。次のコマンドで各改行文字がスペース文字に置き換えられることを期待していました。これは複数の行を取り、それらを1つの長い単一行に結合します。代わりに、これは出力の最後の行のみを表示します。後続の各行を次の出力行で上書きするようです。

[email protected]:~/Work/Cacti $ ./script | tr '\n' ' '
Data Rate:                    2880        [email protected]:~/Work/Cacti $
[email protected]:~/Work/Cacti $

更新

さらに詳しく調べると、各行の前に改行文字が付いているように見えます。 lessを使用すると、これは^Mとして表示されます。そこで、2つのtrステートメントを追加しました。 1つは改行文字を削除し、もう1つは戻り文字を削除します。

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

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

trは実際には、貼り付けた方法で機能するはずです。改行は確かです\ns?改行をスペースに変換する代わりに削除することで、少し簡単にすることができます。

tr -d '\n'
18
Michael Mrozek

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

使用する 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
Franck

改行文字を削除するには、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' -
0