首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式:在分隔符中匹配文本

正则表达式:在分隔符中匹配文本
EN

Stack Overflow用户
提问于 2015-03-03 20:21:25
回答 3查看 105关注 0票数 1

我会尽量清楚,希望这个问题能对其他有同样问题的人有所帮助。

在我的file.txt中,我只想匹配命令"grep“和"sed”中的文本"(“and ")”。示例:

代码语言:javascript
复制
This is my line and (this is the text to match!), and bla bla bla...

但有些线条看起来可能是:

代码语言:javascript
复制
Another line (text to match 1;) something else, (text to match 2 )

这里的问题是:

表达方式如

grep '(.*)' file.txtsed 's/(.*)//' <file.txt

由于.*在默认情况下是贪婪的,因此无法工作。这意味着,它将匹配第二个示例,如下所示:

另一行(文本匹配1;)其他内容,(文本匹配2 )

解决方案必须是非贪婪匹配,然后我尝试使用非贪婪量词?.

代码语言:javascript
复制
grep -E '\(.*?\)' file.txt

或使用sed

代码语言:javascript
复制
sed -r 's/\(.*\)//' <file.txt

在这种情况下,我们需要使用-E-r来使grep和sed读取扩展表达式,还需要在(之前使用\

但即使这个解决方案似乎也不起作用,我不知道为什么。

然后我尝试了这样的方法:

代码语言:javascript
复制
grep '(.*)[^(]*' file.txt

为了找到只有一个“(文本匹配)”的行,如果我想要重写()中的文本,语法应该是:

代码语言:javascript
复制
sed 's/(.*)\([^(]*\)/(new text)\1/'<file.txt

但是当它看起来很有效的时候,我发现'(.*)[^(]*'和一些像旧的(.*)一样的线相匹配(这是一种迷思.)

有更好的解决办法吗?

提前感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-03 20:28:24

这一准则应能发挥作用:

代码语言:javascript
复制
\(([^\)]+)\)/g

正如您在这里所看到的,它是有效的:

https://regex101.com/r/rR2uF3/1

票数 1
EN

Stack Overflow用户

发布于 2015-03-03 20:34:38

使用gnu awk非常容易:

代码语言:javascript
复制
s='Another line (text to match 1;) something else, (text to match 2 )'

awk 'BEGIN{ FPAT="\\([^)]*\\)" } {for (i=1; i<=NF; i++) print $i}' <<< "$s"
(text to match 1;)
(text to match 2 )
票数 1
EN

Stack Overflow用户

发布于 2015-03-03 21:29:39

你所需要的就是:

代码语言:javascript
复制
$ cat file
Another line (text to match 1;) something else, (text to match 2 )

$ sed 's/(\([^)]*\)/(foo/' file
Another line (foo) something else, (text to match 2 )

$ sed 's/(\([^)]*\)/(foo/2' file
Another line (text to match 1;) something else, (foo)

$ sed 's/(\([^)]*\)/(foo/g' file
Another line (foo) something else, (foo)

非贪婪的量词?从来不需要,而且很少有足够的用处来保证它使您的regexp更难阅读/理解。它也不是所有工具都支持的。在调试“贪婪”匹配问题时,总是首先将.* (如果存在)更改为[^x]*,其中x是在您感兴趣的字符串之后出现的任何字符,在本例中是一个)

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

https://stackoverflow.com/questions/28841217

复制
相关文章

相似问题

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