我正在使用 Ubuntu 20.04.4 和库存 grep 版本 3.4。
我发现一些无法解释的事情,请帮忙。
[/dev/pts/0(xterm-256color) 2023-04-04 10:28:01 ERR:0]
[chj @Ub20cppdev ~/test]
$ cat input3l.csv
"C:\Program Files (x86)\Comodo\",223743576,223920128
"C:\Program Files (x86)\Comodo\Dragon\",223743576,223920128
"C:\Program Files (x86)\Comodo\Dragon\dragon_s.dll",127097864,127098880
[/dev/pts/0(xterm-256color) 2023-04-04 10:28:07 ERR:0]
[chj @Ub20cppdev ~/test]
$ cat input3l.csv | egrep '(".+\\"),'
"C:\Program Files (x86)\Comodo\",223743576,223920128
"C:\Program Files (x86)\Comodo\Dragon\",223743576,223920128
[/dev/pts/0(xterm-256color) 2023-04-04 10:28:19 ERR:0]
[chj @Ub20cppdev ~/test]
$ cat input3l.csv | egrep '(".+\\"),.+'
[/dev/pts/0(xterm-256color) 2023-04-04 10:28:33 ERR:0]
[chj @Ub20cppdev ~/test]
$ cat input3l.csv | egrep '(".+\\"),.+' > egrep1.txt
[/dev/pts/0(xterm-256color) 2023-04-04 10:28:43 ERR:0]
[chj @Ub20cppdev ~/test]
$ cat egrep1.txt
"C:\Program Files (x86)\Comodo\",223743576,223920128
"C:\Program Files (x86)\Comodo\Dragon\",223743576,223920128
答案1
您看到的情况几乎肯定是由于 grep 输出中的颜色代码和输入中的 Windows 样式 (CRLF) 行尾之间的交互造成的。重定向输出时您看不到相同的内容,因为默认的 egrep 别名
$ alias egrep
alias egrep='egrep --color=auto'
仅在写入终端时对输出进行着色。比较以下示例:
$ printf '%s\r\n' 'foobar' | grep --color=always 'foo' | sed l
\033[01;31m\033[Kfoo\033[m\033[Kbar\r$
foobar
$
相对
$ printf '%s\r\n' 'foobar' | grep --color=always 'foo.*' | sed l
\033[01;31m\033[Kfoobar\r\033[m\033[K$
$
您可以看到尾随.*
(或在您的情况下为egrep
/ grep -E
,尾随.+
)正在捕获回车符\r
并发出它前关闭 ANSI 颜色序列\033[m\033[K
,导致其覆盖匹配的文本foo
。