以下内容是有道理的(尽管您看不到debug.cpp的内容)。
$ grep '^[A-Za-z_]' debug.cpp
float CheckExistence();
entity Findgoal(float gno);
void RPrint(const string& msg);
void MakeMeDebug(entity who);
void dremove(entity te)
void display_location()
void RPrint(const string& msg)
void MakeMeDebug(entity who)
现在,当我添加时.*
,如下所示......
$ grep '^[A-Za-z_].*' debug.cpp
结果显示有 8 行空白(我似乎无法让这个网站显示)。我强烈怀疑是 bug,于是我更新到了最新的 grep(版本 2.25),结果还是一样。我使用的是 Ubuntu。
如果我的理解正确,我的正则表达式表示:“匹配以字母 A 到 Z 开头、不区分大小写或下划线的行,后跟任何内容,包括任何内容。”
这是错误吗?还是我做错了什么?
答案1
您的 cpp 是 DOS 格式,即其行终止由 \r\n 序列完成,同时您的会话中存在 grep 的“grep --color=auto”别名。此别名将终端控制转义序列放在匹配的字符串周围。如果该字符串是单词字符,则它不会影响终端上的输出。但是,如果字符串包含回车符(\r,匹配为 .* 的最后一个字符),当它被序列包围时似乎会导致这种副作用。
当使用 --color=auto 调用时,grep 会识别其输出何时发送到管道,然后它不会对字符串进行着色,因此它避免了副作用并出现。
在对 grep 进行去混叠之后,该现象就消失了。
说实话,这根本不是什么显而易见的事情,我花了一段时间才明白为什么即使我使用较长的模式,发送到文件的输出也是正确的,而当输出到终端时它什么都没有显示。