質問: 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) 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 $ 更新:さらに詳しく調べると、各行の前に改行文字が付いているように見えます。 lessを使用すると、これは^mとして表示されます。そこで、2つのtrステートメントを追加しました。 1つは改行文字を削除し、もう1つは戻り文字を削除します。./script | | tr -d '\n' | tr -d '\r'
回答: 使用する 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)