这是我的样本文本。grep w,grep ^w和grep '^[ ]w'工作得很好。
[user@linux ~]$ grep w text.txt
whitespace 0
whitespace 1
whitespace 2
[user@linux ~]$
[user@linux ~]$ grep ^w text.txt
whitespace 0
[user@linux ~]$有1个空间
[user@linux ~]$ grep '^[ ]w' text.txt
whitespace 1
[user@linux ~]$有两个空格,但输出相同
[user@linux ~]$ grep '^[ ]w' text.txt
whitespace 1
[user@linux ~]$根据https://regex101.com/的说法,^[ ]{0,}是在一行开头查找空格的正确语法。但是,在Linux上,grep并不能很好地工作。我得到了错误Invalid regular expression:
[user@linux ~]$ grep ^[ ]{0,}w text.txt
grep: Invalid regular expression
[user@linux ~]$这些根本不回任何东西
[user@linux ~]$ grep '^[ ]{0}w' text.txt
[user@linux ~]$ grep '^[ ]{1}w' text.txt
[user@linux ~]$ grep '^[ ]{2}w' text.txt
[user@linux ~]$ grep '^[ ]{0,}w' text.txt
[user@linux ~]$问: grep是否可以使用^[ ]{0,}?如果是,我以前的语法有什么问题?
发布于 2019-05-08 09:53:57
在BRE中,在贪婪的量词表达式{0,}中,需要转义大括号以实现所需的正则表达式匹配,并始终引用正则字符串。没有引号,shell尝试将自己的解析语法应用于提供的参数,并且在大多数情况下,参数得到分词,使得grep只看到正则表达式的^[部分。
grep '^[ ]\{0,\}w' file从正则表达式引用:量词中选择GNU
\{n,\},其中n >= 0至少重复前一项的n次数。贪婪,因此在尝试与前面项的较少匹配进行排列之前,将尽可能多地匹配项目,直到前一项只匹配n次。
正如注释中所指出的,使用*修饰符相当于使用\{0,\}。
发布于 2019-05-08 09:57:15
Correct命令:
使用grep -E '^[ ]{0,}' text.txt
-E,- extended将模式解释为扩展正则表达式(ERE,见下文)。
Reason为什么不能工作:
不在regex周围使用单引号,bash将打开它,您的命令将变成
grep '^[' ] ]0 text.txt,它将]、]0和text.txt文件上的regex '^['转换为grep。
^[是错误的,因为[是一个特殊的字符,它也需要关闭字符]。
Why -E选项:
{m,n}是一个扩展正则表达式,要使用它,grep需要-E选项。
https://unix.stackexchange.com/questions/517746
复制相似问题