3

私は次のegrepの動作に非常に戸惑っています。

LFで終了するファイルがあります。$'\n'すべての行をgrepすると、期待どおりに返されます。$'\r\n'ただし、ファイルにキャリッジリターンがない場合でも、grepを実行するとすべての行が返されます。なぜgrepはこの不可解な方法で動作するのですか?

[pjanowsk@krakow myplay2]$ cat sample.txt
a
b
n
c
[pjanowsk@krakow myplay2]$ file sample.txt
sample.txt: ASCII text
[pjanowsk@krakow myplay2]$ egrep $'\n' sample.txt 
a
b
n
c
[pjanowsk@krakow myplay2]$ egrep $'\r\n' sample.txt 
a
b
n
c

さらに、ファイルをCRLF終了に変換すると、改行のegrepingはすべての行に一致しますが、carriagereturn+newlineのegrepingは空の文字列を返します。なんで?

[pjanowsk@krakow myplay2]$ unix2dos sample.txt 
unix2dos: converting file sample.txt to DOS format ...
[pjanowsk@krakow myplay2]$ file sample.txt 
sample.txt: ASCII text, with CRLF line terminators
[pjanowsk@krakow myplay2]$ egrep $'\n' sample.txt 
a
b
n
c
[pjanowsk@krakow myplay2]$ egrep $'\r\n' sample.txt 




[pjanowsk@krakow myplay2]$ 

そして最後に、'\n'強い引用符を使用してCスタイルのエスケープを使用せずにegrepを実行すると、バックスラッシュがなくても「n」に一致します。なんで?

[pjanowsk@krakow myplay2]$ egrep '\n' sample.txt 
n
4

2 に答える 2

0

これらのいずれかを試すことができます

  -U, --binary              do not strip CR characters at EOL (MSDOS)
  -u, --unix-byte-offsets   report offsets as if CRs were not there (MSDOS)
于 2013-01-10T06:24:26.850 に答える