Bashから末尾の改行を削除する方法は?

Bashから末尾の改行を削除する方法は?

私はPerlのように動作するものを探していますchomp。入力内容を単に印刷して改行した場合は、最後の文字を引くコマンドを探しています。

$ printf "one\ntwo\n" | COMMAND_IM_LOOKING_FOR ; echo " done"
one
two done
$ printf "one\ntwo" | COMMAND_IM_LOOKING_FOR ; echo " done"
one
two done

(BashとZshのコマンド置換はすべての末尾の改行を削除しますが、最大1つの末尾の改行を削除することを探しています。)

答え1

perl次のことなく行うことができますchomp

$ printf "one\ntwo\n" | perl -pe 's/\n\z// if eof'; echo " done"
one
two done

$ printf "one\ntwo" | perl -pe 's/\n\z// if eof'; echo " done"
one
two done

しかし、自分で試してみてはいかがでしょうかchomp

$ printf "one\ntwo\n" | perl -pe 'chomp if eof'; echo " done"

答え2

これは働きます:

printf "one\ntwo\n" | awk 'NR>1{print PREV} {PREV=$0} END{printf("%s",$0)}' ; echo " done"

スクリプトは常に現在の行の代わりに前の行を印刷し、最後の行は異なる方法で処理されます。

詳細は次のとおりです。

  1. NR>1{print PREV}前の行を印刷します(最初の行を除く)。
  2. {PREV=$0}現在の行をPREV変数に保存します。
  3. END{printf("%s",$0)}最後に改行なしで最後の行を印刷します。

また、これにより、最後から最大1つの空白行が削除されます(削除はサポートされていません"one\ntwo\n\n\n")。

答え3

完全に等しい方法が欲しいなら、chomp私の心に最初に浮かぶ方法はLatinSuDがawkソリューションをリリースしました。。実装するのではなく、chompよく使われるいくつかの一般的なタスクを実装する他のメソッドを追加します。chomp

変数にいくつかのテキストを入力すると、末尾のすべての改行が削除されます。したがって、これらすべてのコマンドは同じ単一の出力ラインを生成します。

echo "$(printf 'one\ntwo') done"
echo "$(printf 'one\ntwo\n') done"
echo "$(printf 'one\ntwo\n\n') done"
echo "$(printf 'one\ntwo\n\n\n\n\n\n\n\n\n\n') done"

これは、ファイルまたはコマンド出力の最後の行にいくつかのテキストを追加したい場合にsed便利です。 GNU sedおよび他のほとんどの最新の実装では、入力が改行文字で終わらなくても機能しますが、まだ改行文字がない場合は改行文字は追加されません。

sed '$ s/$/ done/'

1ただし、これはすべてのsed実装には適用されません。 sed はテキスト処理ツールで、空ではなく改行文字で終わらないファイルはテキストファイルではありません。

答え4

別のperl方法。これは入力全体をメモリに読み込むため、大量のデータの場合、これは良い考えではない可能性があります(cuonglmまたはawkこの方法を使用)。

$ printf "one\ntwo\n" | perl -0777pe 's/\n$//'; echo " done"
one
two done

関連情報