正则表达式中与egrep匹配的部分

6

我想知道在egrep ((GNU grep) 2.5.1)中是否可以选择匹配文本的一部分,例如:

grep '^([a-zA-Z.-]+)[0-9]+' ./file.txt

因此,我只获取与括号内匹配的部分,例如:

house.com

与我通常获得的整行不同:

house.com112

假设我在文件.txt中有一行包含house.com112。
(实际上,这个正则表达式只是一个例子,我想知道是否可以仅打印整行的一部分。)
我知道在某些语言中,比如PHP、Perl或者AWK,我是可以做到的,但是我不知道在egrep中是否可以。
谢谢您提前的帮助!
4个回答

11

使用sed修改grep找到的匹配行的结果:

grep '^[a-zA-Z.-]+[0-9]+' ./file.txt | sed 's/[0-9]\+$//'

或者如果您想坚持使用grep,可以使用带有-o开关的grep而不是sed:

grep '^[a-zA-Z.-]+[0-9]+' ./file.txt | grep -o '[a-zA-Z.-]+'

好的,谢谢大家,这个方法可行,但你们都是对的,我必须处理grep的输出。 - José M. Gilgado

3
你的正则表达式的第一部分比第二部分更加通用,由于+是贪婪的,第二个[0-9]+将只匹配最后一个数字(感谢Paul)。如果你可以让第一部分更具体(例如,如果你知道它会以顶级域名结尾),那么你就可以做到这一点。
有一个非常酷的工具叫做ack,它基本上是带有perl正则表达式的grep。我不确定在你的情况下是否可以使用它,但如果你能在perl中做到你想要的,你就可以使用ack来实现。
编辑:
为什么不直接删除正则表达式的末尾?如果这样做会有误报吗?如果有,你可以再次使用egrep将结果与正则表达式的第一部分匹配。
这似乎就是你所询问的内容:此外,如果你不知道,-o标志将仅输出给定行的匹配部分。

哦,是的,你说得对,那个是一个愚蠢的例子。我现在要改变它。编辑:我已经修改了,类似这样。 - José M. Gilgado
+1 表示确认,尽管 [0-9]+ 必须至少匹配一个字符,我相信你已经意识到了。 - Paul Creasey

3

你可能希望尝试grep命令中的-o和-w选项。egrep已经“弃用”,所以使用grep -E代替。

$ echo "test house.com house.com112"| grep -Eow "house.com"
house.com

基本思路是遍历每个单词并测试是否相等。
$ echo "test house.com house.com112"| awk '{for(i=1;i<=NF;i++){ if($i=="house.com") print $i}}'
house.com

2

使用正则表达式的前瞻功能

$ echo 'house.com112' | grep -Po '([a-zA-Z.]+)(?=\d+)'
house.com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接