-b、-before
セパレーターは、ファイル内で先行するレコードの先頭に付加されます。
そして、私は次の出力を理解できません:
$ echo -e "Hello\nNew\nWorld\n!" > file
$ tac file
!
World
New
Hello
$ tac -b file
!
World
NewHello
New
とHello
の間に改行がないのはなぜですか?
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
tac
のおかげで、それは奇妙に見えますが、私にとっては直感に反する方法で機能します。はっきり見えるセパレーター-コンマを利用しましょう。
次のコマンドの結果として何が表示されると思いますか。
_% echo -ne 'A,B,C' | tac -s,
_
?
まあ、AがBからCに分離されているので、それがわかります。したがって、(私は結論として)逆に印刷されるので、それらは_C,B,A
_を構成する必要があります。確認しよう。残念ながら、代わりに別の方法で印刷します。
_% echo -ne 'A,B,C' | tac -s,
CB,A,
_
tac
スティックは、元のセパレータの配置に使用できると結論付けることができます。A
はB
と同じように後で使用できますが、C
はそれを持たないため、次のように印刷されます。です。
今回、_-b
_を指定してtac
を実行するとどうなりますか?
_% echo -ne 'A,B,C' | tac -bs,
,C,BA
_
どうやらこれは_-b
_に対してこのように機能します。セパレータを見つけるまで、入力を逆方向に処理します。それが見つかると、印刷されます:
_,
_。次に、検索中にスキップしたテキストを出力します。
C
。その後、サイクルが繰り返されます。
_,B
_。セパレータが残っていないので、残りだけが出力されます:
A
。
NewとHelloの間に改行がないのはなぜですか?
上記で説明した説明によると、New
は改行のプレフィックスが付いているため、新しい行に表示されますが、Hello
がなかったため、そのまま印刷されます。