tac コマンドオプションが奇妙な出力を生成します。 【問題の理解】

tac コマンドオプションが奇妙な出力を生成します。 【問題の理解】

次の内容のみを含むファイルがあるとします。

a
b
c
b
a

tac --separator=a file[DebianベースのLinuxで] BASHを使用すると、次のようになります。

                  # empty line
                  # empty line
b
c
b
aacommand@prompt  # two a just before the prompt


質問:私が理解しているところ--separator=aによるとanewlineこれは正しいですか?

より多くの入力のために別の文字列を試してみましたが、結果は乱雑です。他のオプションはすべてうまくいくと思います。を使用すると、tac --before最初は約5〜1本の空行が表示されますが、実際にはそのようなことが発生することになっています。そうですか?

ベストアンサー1

tac区切り文字がレコードの終端である場合、つまり、区切り文字が最後のレコードの後に​​表示される場合の基本設計用途の文脈で理解するのは簡単です。レコードを逆順に印刷します(各ターミネーターを含む)。

$ echo -n fooabara | tac -s a; echo
rabafooa

入力は3つのレコード(foobおよびr)で構成され、それぞれの後に区切り文字が続きます。a出力は3つのレコード(rbおよびfoo)で構成され、各レコードの後に​​区切り文字が続きますa

最後のレコードがレコードターミネータで終わらない場合でも、レコード区切り文字なしで最初に印刷されます。

$ echo -n fooabar | tac -s a; echo
rbafooa

最後のレコードの末尾に区切り文字がないため、最後のレコードは区切り文字なしでr2番目のレコードに関連付けられます。b

改行のため、入力内容が少し歪んでいるようです。改行文字の代わりにコンマを使用して見てみましょう。

$ echo -n a,b,c,b,a, | tac -s a; echo
,,b,c,b,aa

3 つの入力レコードがあります。空のレコード(終了者があるa)、大きなレコード,,b,c,b,(やはり終了者がある)、,終了していないレコードがあります。レコード(終了者を持たない最後のレコードを除いて、それぞれ終了者がある)は、逆の順序で印刷されます。

あなたの混乱は、おそらく「区切り記号」が区切り記号であると予想したことに起因しています。しかし、これは間違った名前です。実際にはレコードの終端者です。--beforeイニシエータとして作成します。

おすすめ記事