Windows Server 上的 GNU grep 中的正则表达式匹配失败

Windows Server 上的 GNU grep 中的正则表达式匹配失败

这是我的档案头:

id,date,section,identifier,action,level,user_id,week,month,seconds_since_start
9464384,334600,12,,complete,4,1124822691805,1,1,1
9464413,334626,12,,complete,4,1124822691805,1,1,1
9464430,334659,12,,complete,4,1124822691805,1,1,1
9464470,334692,12,,complete,4,1124822691805,1,1,1
9464560,334772,12,,complete,4,1124822691805,1,1,1
9464756,335003,12,,complete,4,1124822691805,1,1,-1

我在 Windows Server 2016 上使用 mintty(与 git 一起安装)的 grep 和简单正则表达式时遇到了麻烦

我想知道是否有任何行以减号结尾,因此我希望起作用的命令是:

 grep '-[0-9]+$' file.csv

找不到匹配项。我可以进一步简化正则表达式,这个也找不到匹配项:

grep '1$' file.csv 

我曾尝试用双刻度替换单刻度(以下这里) 以及用 egrep 替换 grep,但这些改变并没有什么区别。

我是否遗漏了一些显而易见的东西?

答案1

问题 1:您的模式以连字符开头,这会使 grep 产生歧义。它是命令行选项,还是正则表达式?选项-e明确grep告诉 grep 下一个选项是要使用的正则表达式。同样,--告诉 grep 后面没有其他命令行选项,因此下一个参数是正则表达式。

我无法访问 Windows 机器,但 FreeBSDgrep在您的第一个示例中报告了错误:

$ grep '-[0-9]+$' file.csv
grep: invalid option -- [
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

grep将字符串视为带引号的命令行选项,并由于没有选项-[...而报告错误。grep-[

您的第二条命令在 BSD 上成功:

$ grep '1$' file.csv
9464384,334600,12,,complete,4,1124822691805,1,1,1
9464413,334626,12,,complete,4,1124822691805,1,1,1
9464430,334659,12,,complete,4,1124822691805,1,1,1
9464470,334692,12,,complete,4,1124822691805,1,1,1
9464560,334772,12,,complete,4,1124822691805,1,1,1
9464756,335003,12,,complete,4,1124822691805,1,1,-1

由于这两个原因,我认为您的grep实施可能存在问题。

问题2:您的正则表达式使用扩展正则表达式语法,而 grep 默认使用基本正则表达式语法。FreeBSD 手册页egrep描述了基本正则表达式和扩展正则表达式之间的主要区别:

在基本正则表达式中,元字符 ?、+、{、|、( 和 ) 失去了其特殊含义;而是使用反斜杠版本 \?、\+、\{、\|、\( 和 \)。

您需要使用选项-Egrep其解析为扩展正则表达式,或者+使用反斜杠进行转义:

$ grep -- '-[0-9]+$' file.csv
$ grep -E -- '-[0-9]+$' file.csv
9464756,335003,12,,complete,4,1124822691805,1,1,-1
$ grep -- '-[0-9]\+$' file.csv
9464756,335003,12,,complete,4,1124822691805,1,1,-1

相关内容