回答:
貧しい人がsponge
使用しているawk
:
awk '{a[NR] = $0} END {for (i = 1; i <= NR; i++) print a[i]}'
あなたが持っているならtac
、あなたもそれを誤用することができます:
... | tac | tac
tac
シンプルでエレガントだと思います。
| tac | tac
は単純ですが、タスクにとって非常に非効率的であり、特に大きなファイルの場合、パフォーマンスに影響を与えることに注意してください。
これsponge
はmoreutilsから実行できます。sponge
「標準入力を吸収してファイルに書き込む」。引数がない場合、そのファイルは標準出力です。このコマンドへの入力は、EOFまでメモリに格納され、その後、一度にすべて書き込まれます。
通常のファイルに書き込む場合は、ファイル名を指定するだけです。
cmd | sponge filename
の主な目的はsponge
、パイプライン内で同じファイルからの読み取りと書き込みを可能にすることですが、それも必要なことを行います。
入力がASCIIテキストである限り(最後までNUL 0x0バイトを含まない)、sed -z
必要なことを行います:
$ sed -z ''
Line 1
Line 2
Line 3
^D
Line 1
Line 2
Line 3
$
-z
原因となるsed
代わりに、通常の改行の行区切り文字としてNULバイトを処理すること。したがって、入力がNULバイトのない通常のテキストである限り、sofはEOFに達するまで入力全体をパターンバッファーに読み込み続けます。 sed
その後、バッファに対して処理を行わずに出力します。
入力にNULバイトが存在する場合は、代わりにこれを行うことができます。
sed ':l;N;bl'
このsed
ソリューションは、DigitalTraumaのソリューションより少し長くなりますが、NULバイトでも機能します。
sed -n 'H;${x;s/^\n//;p}'
sed ':l;N;bl'
も動作するはずです。
あなたが求めている行動、それは単純な猫のデフォルトの行動ではありませんか?
gv@debian:$ cat << EOF #or cat <<EOF >file or cat <<EOF >/dev/stdout
> Line 1
> Line 2
> Line 3
> EOF
Line 1
Line 2
Line 3
gv@debian:$
cat
(入力)Line 1
(入力)と何が起こるかを参照してください。
Pythonを除いて、muruのawkの例と同じ考えです。CtrlD行での読み取りを停止するために使用します
$ python -c 'import sys;print("".join(sys.stdin.readlines()))'
line1
line2
line3 # press Enter and Ctrl+D at this point
line1
line2
line3
perl -e 'print <>'
(!)
sort
、この目的で使用します。明らかにそれは望ましくないかもしれない副作用を持っています。