私は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"
スクリプトは常に現在の行の代わりに前の行を印刷し、最後の行は異なる方法で処理されます。
詳細は次のとおりです。
NR>1{print PREV}
前の行を印刷します(最初の行を除く)。{PREV=$0}
現在の行をPREV
変数に保存します。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