web-dev-qa-db-ja.com

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

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

148
hexacyanide

予想される出力が単一行の場合、出力からすべての改行文字を削除することができます。 '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)"

ファイルからTHE LAST改行文字を厳密に削除したい場合は、Perlを使用してください。

Perl -pe 'chomp if eof' log.txt


削除したい末尾の改行文字が確実にある場合は、GNU coreutilsの 'head'を使用して、最後のバイト以外のすべてを選択できます。これはかなり速いはずです。

head -c -1 log.txt

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

cat -A log.txt
191
Steve

一方通行:

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

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

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

出力を変数に代入すると、bashは自動的に空白を削除します。

linecount=`wc -l < log.txt`
8
nneonneo

printf はすでに末尾の改行を切り取ります。

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

詳細:

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

Bashで何かの出力を行末なしで出力したい場合は、-nスイッチを使ってエコーします。

あなたがすでにそれを変数の中に持っているなら、それから 末尾の改行 を切り取ってエコーする:

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

あるいは、1行で実行することもできます。

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