web-dev-qa-db-ja.com

tacの説明--before

-b、-before

セパレーターは、ファイル内で先行するレコードの先頭に付加されます。

そして、私は次の出力を理解できません:

$ echo -e "Hello\nNew\nWorld\n!" > file
$ tac file
!
World
New
Hello
$ tac -b file


!
World
NewHello

NewHelloの間に改行がないのはなぜですか?

12
SantaXL

tacは、レコードとそのセパレーターattachedをデフォルトで対応するレコードの後に​​使用します。これは、セパレーターが切り離されている他のレコードベースのツール(AWKなど)と比較すると多少直観に反しています。

-bを使用すると、改行が付加されたレコードは次のようになります(元の順序)。

  • Hello
  • \nNew
  • \nWorld
  • \n!
  • \n

逆に出力すると、これは

\n\n!\nWorld\nNewHello

これは、表示される出力に対応しています。

-bがない場合、改行が添付されたレコードは次のようになります。

  • Hello\n
  • New\n
  • World\n
  • !\n

逆に出力すると、これは

!\nWorld\nNew\nHello\n
23
Stephen Kitt

tacのおかげで、それは奇妙に見えますが、私にとっては直感に反する方法で機能します。はっきり見えるセパレーター-コンマを利用しましょう。

次のコマンドの結果として何が表示されると思いますか。

_% echo -ne 'A,B,C' | tac -s,
_

まあ、AがBからCに分離されているので、それがわかります。したがって、(私は結論として)逆に印刷されるので、それらは_C,B,A_を構成する必要があります。確認しよう。残念ながら、代わりに別の方法で印刷します。

_% echo -ne 'A,B,C' | tac -s,
CB,A,
_

tacスティックは、元のセパレータの配置に使用できると結論付けることができます。ABと同じように後で使用できますが、Cはそれを持たないため、次のように印刷されます。です。

今回、_-b_を指定してtacを実行するとどうなりますか?

_% echo -ne 'A,B,C' | tac -bs,
,C,BA
_

どうやらこれは_-b_に対してこのように機能します。セパレータを見つけるまで、入力を逆方向に処理します。それが見つかると、印刷されます:

_,_。次に、検索中にスキップしたテキストを出力します。

C。その後、サイクルが繰り返されます。

_,B_。セパレータが残っていないので、残りだけが出力されます:

A

NewとHelloの間に改行がないのはなぜですか?

上記で説明した説明によると、Newは改行のプレフィックスが付いているため、新しい行に表示されますが、Helloがなかったため、そのまま印刷されます。

5
poige