令人困惑的 egrep 匹配换行符的问题

3

我一直对以下egrep行为感到困惑:

我有一个以LF结尾的文件。当我用$'\n'搜索时,所有行都按预期返回。但是当我用$'\r\n'搜索时,即使文件中没有回车符,所有行也会被返回。为什么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结尾时,使用egrep命令搜索换行符可以匹配所有行,但是搜索回车+换行符则返回空字符串。为什么呢?
[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]$ 

最后,如果我使用带有强引号但没有C风格转义的egrep '\n',即使没有反斜杠,也会匹配“n”。为什么?
[pjanowsk@krakow myplay2]$ egrep '\n' sample.txt 
n
2个回答

1
第一个 egrep 返回每一行,因为您的 shell 将 $'\n' 视为名为 '\n' 的变量。该变量计算为空字符串,因此 egrep 看到的是 "egrep '' sample.txt"。这将返回所有行。
我不认为 grep 或 egrep 允许匹配行尾字符本身。它们使用 EOL 将文件分成匹配或不匹配的行。
您可以使用 pcregrep,它将使用“Perl 兼容”正则表达式,并且可以轻松匹配多行正则表达式。

0

可以尝试其中之一

  -U, --binary              do not strip CR characters at EOL (MSDOS)
  -u, --unix-byte-offsets   report offsets as if CRs were not there (MSDOS)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接