-b、--以前
区切り文字は、ファイルの前のレコードの先頭に追加されます。
次の出力がわかりません。
$ echo -e "Hello\nNew\nWorld\n!" > file
$ tac file
!
World
New
Hello
$ tac -b file
!
World
NewHello
New
との間に改行文字がないのはなぜですかHello
?
答え1
tac
レコードと区切り文字を使用してください。付属、デフォルトは対応するレコードの後です。これは、区切り文字の分離を実行するAWKなどの他のレコードベースのツールと比較して、わずかに直感的にずれます。
の場合、-b
改行文字が追加されたレコードは次のとおりです(元の順序で)。
Hello
\nNew
\nWorld
\n!
\n
逆方向出力は
\n\n!\nWorld\nNewHello
これはあなたが見る出力に対応します。
それ以外の場合、-b
レコードと追加された改行は次のようになります。
Hello\n
New\n
World\n
!\n
逆方向出力は
!\nWorld\nNew\nHello\n
答え2
私にとっては、これは奇妙に見えます。部分的には、tac
それがどのように機能するかが少し反直感的だからです。明確に見える区切り記号であるカンマを使用します。
次のコマンドの結果を見たいです。
% echo -ne 'A,B,C' | tac -s,
?
まあ、AはBとは別で、BはCとは別だと思います。だから(私の結論は)逆方向に印刷するとC,B,A
。確認してみましょう。ああ、別の方法で印刷されます。
% echo -ne 'A,B,C' | tac -s,
CB,A,
tac
もともと区切り記号があったバーがあると結論付けることができます。A
その後もまだありますが、B
存在しC
ない場合はそのまま印刷されます。
tac
この時間を持って走ると-b
どうなりますか?
% echo -ne 'A,B,C' | tac -bs,
,C,BA
次のように動作するようです-b
。区切り文字が見つかるまで入力を逆に繰り返します。印刷されたことがわかりました:
,
。次に、検索中にスキップされたテキストを印刷します。
C
。その後、ループを繰り返します。
,B
。残りの区切り文字がないため、残りの部分だけが印刷されます。
A
。
NewとHelloの間に改行文字がないのはなぜですか?
上記の説明によれば、New
改行文字が前に付くので新しい行に表示されますが、Hello
そうでないため、そのまま印刷されます。