きれいで明確なPOSIXと同等のものはありますかtac
?
読みやすさと簡潔さの両方を考慮する必要があります。
答え1
最もクリーンPOSIX等しい
tail -r
〜のように
-r Reverse. Copies lines from the specified starting point in
the file in reverse order. The default for r is to print the
entire file in reverse order.
次回受諾POSIX質問(すぐにすべてのプラットフォームでサポートされることを願っています。)
これが不可能な場合tail -r
は(あなたと他の人が実証したように)、「クラシック」テキスト処理ツールを正常に使用してファイルの行を置き換えることができます。
読みやすさと簡潔さはさておき、古いものでさえed
これを行うことができます:
ed -s infile <<\IN
g/^/m0
,p
q
IN
あるいは、パイプの出力を反転するには、まずテキストバッファに読みます。
ed -s <<\IN
r ! your | pipeline | goes | here
g/^/m0
,p
q
IN
答え2
sed
「一般人」は読むことはできませんが、次の1行のコードでこれを行うことができます。
sed -n '1h;1!{x;H;};${g;p;}' file.txt
説明する:
-n
sed
各行の印刷を無効にするデフォルトの動作です。
1h
最初の行は予約済みスペースに保存されます。
1!{...}
このコマンドブロックをすべての行に適用するとは別に最初に。
x
ホールド空間とパターン空間を交換します。 (パターンスペースは各行が処理されたときに保存される場所です。)H
その後、改行文字が予約済みスペースに追加され、その後にパターンスペースの(新しい)内容が追加されます。
${...}
最後のブロックは、最後の行に達した場合にのみ適用されます。g
予約済みスペースの内容を取得し、パターンスペースに入れてp
パターンスペースを印刷します。
もちろん、これはファイル全体を一度にメモリに保存できるかどうかによって異なります。非常に大きなファイルでは失敗する可能性があります。
答え3
以下は、ファイル全体をメモリに保存するawkスクリプトです。
awk '{line[NR]=$0} END {for (i=NR; i>=1; i--) print line[i]}' file
シェル関数で表現すると、次のようになります。
tac () { awk '{line[NR]=$0} END {for (i=NR; i>=1; i--) print line[i]}' "$@"; }
答え4
私は好む肉とにかく結果を見たい場合は、自分で行うことができます。
もちろん、コマンドモードは次のようになります。
:g/^/m0
ファイル全体を元に戻したくない場合は、コンテンツの移動場所と方法に注意する限り、いつでも:gaの範囲を指定できます。
:1,10g/^/m0
ed
以下を使用してスクリプトを作成できます。ex
$ ed -s infile <<IN
g/^/m0
,p
w
IN
そして
$ ex -s infile <<EOS
g/^/move0
wq
EOS
私はいつもこれをする。
「-r」は次に切り替わります。尾公開時にPOSIXと互換性がありません:
tail [-f] [-c number|-n number] [file]