ファイルにキャリッジリターンが含まれていると、grepが予期しない出力を印刷するのはなぜですか? [コピー]

ファイルにキャリッジリターンが含まれていると、grepが予期しない出力を印刷するのはなぜですか? [コピー]

このようにgrepを実行すると、期待どおりに一致を見ることができます。

$> echo -ne 'foo\nfoo\n' > file_a
$> grep -Hn foo file_a
file_a:1:foo
file_a:2:foo

ただし、キャリッジリターンを含むファイルを生成すると、grepは予期しない出力を表示します。

$> echo -ne '\x0dfoo\x0dfoo\nfoo\n' > file_b
$> grep -Hn foo file_b
fooe_b:1:
file_b:2:foo

なぜこの出力が出てくるのかを説明できる人はいますか?

答え1

これは驚くべきことではありません。 Enter キーを押すと、カーソルが行の先頭に移動します。ファイル名と行番号が印刷され、一致する行の内容がその行を上書きします(行grepの最初と前後のキャリッジリターンのため)。foo

キャリッジリターン文字は、次のように\r書くこともできます。

printf '\rfoo\rfoo\nfoo\n' >file

これにより、2行のファイルが生成されます。最初の行には単語がfoo2回含まれますが、キャリッジリターンを使用すると、カーソルが行の先頭に移動します。を使用してこのファイルを表示すると、cat最初の行に1つしかないようです。foo

関連情報