我会尽量清楚,希望这个问题能对其他有同样问题的人有所帮助。
在我的file.txt中,我只想匹配命令"grep“和"sed”中的文本"(“and ")”。示例:
This is my line and (this is the text to match!), and bla bla bla...但有些线条看起来可能是:
Another line (text to match 1;) something else, (text to match 2 )这里的问题是:
表达方式如
grep '(.*)' file.txt或sed 's/(.*)//' <file.txt
由于.*在默认情况下是贪婪的,因此无法工作。这意味着,它将匹配第二个示例,如下所示:
另一行(文本匹配1;)其他内容,(文本匹配2 )
解决方案必须是非贪婪匹配,然后我尝试使用非贪婪量词?.
grep -E '\(.*?\)' file.txt或使用sed
sed -r 's/\(.*\)//' <file.txt在这种情况下,我们需要使用-E和-r来使grep和sed读取扩展表达式,还需要在(之前使用\。
但即使这个解决方案似乎也不起作用,我不知道为什么。
然后我尝试了这样的方法:
grep '(.*)[^(]*' file.txt为了找到只有一个“(文本匹配)”的行,如果我想要重写()中的文本,语法应该是:
sed 's/(.*)\([^(]*\)/(new text)\1/'<file.txt但是当它看起来很有效的时候,我发现'(.*)[^(]*'和一些像旧的(.*)一样的线相匹配(这是一种迷思.)
有更好的解决办法吗?
提前感谢
发布于 2015-03-03 20:28:24
发布于 2015-03-03 20:34:38
使用gnu awk非常容易:
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 )发布于 2015-03-03 21:29:39
你所需要的就是:
$ 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是在您感兴趣的字符串之后出现的任何字符,在本例中是一个)。
https://stackoverflow.com/questions/28841217
复制相似问题