为什么 egrep 输出两个空行,但“重定向到文件”会产生实际文本

为什么 egrep 输出两个空行,但“重定向到文件”会产生实际文本

我正在使用 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

也可以看看在 curl 请求之后管道化 grep 时,正则表达式的工作方式非常奇怪

相关内容