Bash:出力から末尾の改行を削除します


189

Bash(または具体的にはwc -l < log.txt)でコマンドを実行すると、出力の後に改行が含まれます。どうすれば取り除くことができますか?

回答:


251

予想される出力が1行の場合、出力からすべての改行文字を削除できます。パイプして 'tr'ユーティリティ、または必要に応じてPerlにパイプすることは珍しくありません。

wc -l < log.txt | tr -d '\n'

wc -l < log.txt | perl -pe 'chomp'

コマンド置換を使用して、末尾の改行を削除することもできます。

echo -n "$(wc -l < log.txt)"

printf "%s" "$(wc -l < log.txt)"

受け入れられた回答を選択するというOPの決定には同意しません。可能な限り「xargs」の使用は避けるべきだと思います。はい、かっこいいおもちゃです。いいえ、ここでは必要ありません。


予想される出力に複数の行が含まれる可能性がある場合は、別の決定を行う必要があります。

ファイルの末尾から複数の改行文字を削除する場合は、もう一度cmd置換を使用します。

printf "%s" "$(< log.txt)"

最後の改行文字をファイルから完全に削除する場合は、Perlを使用します。

perl -pe 'chomp if eof' log.txt


削除する末尾の改行文字があることが確実な場合は、GNU coreutilsの「head」を使用して、最後のバイトを除くすべてを選択できます。これは非常に速いはずです:

head -c -1 log.txt

また、完全を期すために、「cat」および「show-all」フラグを使用して、改行(またはその他の特殊)文字がファイルのどこにあるかをすばやく確認できます。ドル記号は各行の終わりを示します。

cat -A log.txt

これにより、タイトルが要求する末尾の改行だけでなく、出力からすべての改行が削除されます。
コーディA.レイ14

@ CodyA.Ray:ただし、この質問は、1行の出力しか生成しない特定のコマンドについて説明していることに同意する必要があります。ただし、より一般的なケースに合わせて回答を更新しました。HTH。
Steve

3
これは、短いオプションが長いオプションに置き換えられた場合に適しています。長いオプションは機能と同様に教えますtr --delete '\n'
Elijah Lynn

1
私もやりました| tr -d '\r'
AlikElzin-kilaka

ファイルが非常に大きい場合、cmd置換ソリューションでは行が長すぎる可能性があることに注意してください。
2017

88

一方通行:

wc -l < log.txt | xargs echo -n

24
良い例:echo -n `wc -l log.txt`
サティア2013

9
パイプを使用するよりもバッククォートでコマンドを実行する方が良いのはなぜですか?
マシュー・シンケル2014

2
これらは、末尾の改行を削除するだけでなく、連続する空白(より正確には、で定義されているIFS)を1つのスペースに詰め込みます。例:echo "a b" | xargs echo -n; echo -n $(echo "a b")。これは、ユースケースの問題である場合とそうでない場合があります。
musiphil '15

14
さらに悪いことに、出力がで始まる場合は-e、のオプションとして解釈されますecho。を使用する方が常に安全printf '%s'です。
ムシフィル'15

1
xargsは私のシステムでは非常に遅い(そして他のシステムでもそうだとprintf '%s' $(wc -l log.txt)思う)ので、printf通常は組み込みなので(情報のリダイレクトもないため)より速いかもしれません。バックティックを使用しないでください。新しいPOSIXバージョンでは廃止されており、多くの欠点があります。
yyny 2018年

14

Bash変数置換での空白除去の直接サポートもあります

testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}

1
次も使用できますtrailing_linebreak_removed=${testvar%?}
PairedPrototype

コマンド置換を使用している場合は、末尾の改行を削除するために何もする必要がないことに注意してください。bashはすでにコマンド置換の一部としてその処理を行います。gnu.org/software/bash/manual/html_node/...
マイケル・バリ

10

出力を変数に割り当てると、bash空白が自動的に削除されます。

linecount=`wc -l < log.txt`

10
正確には、末尾の改行は削除されます。それらを削除するのはコマンドの置換であり、変数の割り当てではありません。
chepner 2012

2
$(cmd / c echo%VAR%)を使用しても、Cygwinのbashで末尾の空白が削除されないことがわかりました。この場合、$ {var %% [[:space:]]}を使用する必要がありました。
Andrey Taranov 2013年

1
注:変数の代入ではなく、改行を削除する式の展開です。
Ciro Santilli郝海东冠状病六四事件法轮功

10

printfはすでに末尾の改行をクロップします:

$ printf '%s' $(wc -l < log.txt)

詳細:

  • printfは、%s文字列プレースホルダーの代わりにコンテンツを印刷します。
  • 改行(%s\n)を印刷するように指示しない場合は、印刷されません。

7
のよう"$(command)"にコマンドを二重引用符で囲むと、内部の改行が保持され、末尾の改行のみが削除されます。シェルはここですべての作業を行っています。これprintfは、コマンド置換の結果をに戻すための単なる方法stdoutです。
ブレントブラッドバーン、2014

2
ここで新しい行を削除するのはprintfではなく、$( )構成体でそれを実行しているシェルです。ここに証明があります:printf "%s" "$(perl -e 'print "\n"')"
Flimm

繰り返しになりますが、結果として得られるコマンドラインが長くなりすぎる可能性があることに注意してください。
2017

これは、@ nobarの提案による便利なソリューションです。 $ printf '%s' "$(wc -l < log.txt)"
イリアスカリム

10

最後の改行だけを削除する場合は、次のようにパイプします

sed -z '$ s/\n$//'

sed追加しないであろう\0デリミタに設定されている場合、ストリームの終わりまでをNUL介して-zPOSIXテキストファイルを作成するのに対し、(内端部に定義され\n、それは、出力が最終常に、あろう)\n無し-z

例えば:

$ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
foo
bartender

そしてNUL追加されていないことを証明するために:

$ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
00000000: 666f 6f0a 6261 72                        foo.bar

末尾の複数の改行削除するには、次のようにパイプします。

sed -Ez '$ s/\n+$//'

これはGNU拡張機能だと思いますが、Mac sedでは提供されていません-z
Spidey

7

行の終わりなしにBashの出力を印刷したい場合は、 -nスイッチを使用出力します。

すでに変数にある場合は、 末尾の改行をトリミングます

    $ testvar=$(wc -l < log.txt)
    $ echo -n $testvar

または、代わりに1行で行うこともできます。

    $ echo -n $(wc -l < log.txt)

2
変数は技術的に不要です。echo -n $(wc -l < log.txt)同じ効果があります。
chepner 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.