回答:
予想される出力が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
tr --delete '\n'
。
| tr -d '\r'
一方通行:
wc -l < log.txt | xargs echo -n
echo -n `wc -l log.txt`
IFS
)を1つのスペースに詰め込みます。例:echo "a b" | xargs echo -n
; echo -n $(echo "a b")
。これは、ユースケースの問題である場合とそうでない場合があります。
-e
、のオプションとして解釈されますecho
。を使用する方が常に安全printf '%s'
です。
xargs
は私のシステムでは非常に遅い(そして他のシステムでもそうだとprintf '%s' $(wc -l log.txt)
思う)ので、printf
通常は組み込みなので(情報のリダイレクトもないため)より速いかもしれません。バックティックを使用しないでください。新しいPOSIXバージョンでは廃止されており、多くの欠点があります。
testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}
trailing_linebreak_removed=${testvar%?}
出力を変数に割り当てると、bash
空白が自動的に削除されます。
linecount=`wc -l < log.txt`
printfはすでに末尾の改行をクロップします:
$ printf '%s' $(wc -l < log.txt)
詳細:
%s
文字列プレースホルダーの代わりにコンテンツを印刷します。 %s\n
)を印刷するように指示しない場合は、印刷されません。"$(command)"
にコマンドを二重引用符で囲むと、内部の改行が保持され、末尾の改行のみが削除されます。シェルはここですべての作業を行っています。これprintf
は、コマンド置換の結果をに戻すための単なる方法stdout
です。
$( )
構成体でそれを実行しているシェルです。ここに証明があります:printf "%s" "$(perl -e 'print "\n"')"
$ printf '%s' "$(wc -l < log.txt)"
最後の改行だけを削除する場合は、次のようにパイプします。
sed -z '$ s/\n$//'
sed
追加しないであろう\0
デリミタに設定されている場合、ストリームの終わりまでをNUL
介して-z
POSIXテキストファイルを作成するのに対し、(内端部に定義され\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+$//'
sed
では提供されていません-z
。
行の終わりなしにBashの出力を印刷したい場合は、 -n
スイッチを使用出力します。
$ testvar=$(wc -l < log.txt)
$ echo -n $testvar
または、代わりに1行で行うこともできます。
$ echo -n $(wc -l < log.txt)
echo -n $(wc -l < log.txt)
同じ効果があります。