首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么‘^[ ]{0,}’不适用于linux grep?

为什么‘^[ ]{0,}’不适用于linux grep?
EN

Unix & Linux用户
提问于 2019-05-08 09:41:32
回答 2查看 859关注 0票数 2

这是我的样本文本。grep wgrep ^wgrep '^[ ]w'工作得很好。

代码语言:javascript
运行
复制
[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个空间

代码语言:javascript
运行
复制
[user@linux ~]$ grep '^[ ]w' text.txt
 whitespace 1
[user@linux ~]$

有两个空格,但输出相同

代码语言:javascript
运行
复制
[user@linux ~]$ grep '^[  ]w' text.txt
 whitespace 1
[user@linux ~]$

根据https://regex101.com/的说法,^[ ]{0,}是在一行开头查找空格的正确语法。但是,在Linux上,grep并不能很好地工作。我得到了错误Invalid regular expression

代码语言:javascript
运行
复制
[user@linux ~]$ grep ^[ ]{0,}w text.txt
grep: Invalid regular expression
[user@linux ~]$

这些根本不回任何东西

代码语言:javascript
运行
复制
[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,}?如果是,我以前的语法有什么问题?

EN

回答 2

Unix & Linux用户

发布于 2019-05-08 09:53:57

在BRE中,在贪婪的量词表达式{0,}中,需要转义大括号以实现所需的正则表达式匹配,并始终引用正则字符串。没有引号,shell尝试将自己的解析语法应用于提供的参数,并且在大多数情况下,参数得到分词,使得grep只看到正则表达式的^[部分。

代码语言:javascript
运行
复制
grep '^[ ]\{0,\}w' file

正则表达式引用:量词中选择GNU

\{n,\},其中n >= 0至少重复前一项的n次数。贪婪,因此在尝试与前面项的较少匹配进行排列之前,将尽可能多地匹配项目,直到前一项只匹配n次。

正如注释中所指出的,使用*修饰符相当于使用\{0,\}

票数 1
EN

Unix & Linux用户

发布于 2019-05-08 09:57:15

Correct命令:

使用grep -E '^[ ]{0,}' text.txt

-E,- extended将模式解释为扩展正则表达式(ERE,见下文)。

Reason为什么不能工作:

不在regex周围使用单引号,bash将打开它,您的命令将变成

grep '^[' ] ]0 text.txt,它将]]0text.txt文件上的regex '^['转换为grep。

^[是错误的,因为[是一个特殊的字符,它也需要关闭字符]

Why -E选项:

{m,n}是一个扩展正则表达式,要使用它,grep需要-E选项。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/517746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档