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