使用grep和\A正则表达式匹配字符串

3

在某个文件中有一个字符串:

hel           string1
hell          string2
hello         string3

我想使用 cat file | grep 'regexp here' 仅捕获 hel

我尝试了很多正则表达式,但似乎都不起作用。最有意义的是: grep -E '\Ahel' 但它似乎不起作用。在 http://rubular.com/ 上可以工作。有任何想法为什么在 grep 中不起作用吗?

此外,在每行前面有一个制表符的字符串中粘贴上述字符串时,\Arubular 上似乎不起作用。我认为 \A 匹配字符串的开头,并且无论它之前有什么字符都没有关系。为什么在字符串前加空格后,\A 停止匹配呢?

4个回答

3

ERE (-E) 不支持使用\A来表示匹配的起始位置。请使用^代替。

使用-m 1可在每个文件中找到第一个匹配项后停止搜索。

如果您只想让grep打印匹配的字符串(而不是整行),请使用-o

如果您想要抑制grep输出中的文件名,请使用-h

示例:

 grep -Eohm 1 "^hel" *.log

如果您需要强制仅在文件的第一行输出搜索字符串,则可以使用 head 命令:

 head -qn 1 *.log | grep -Eoh "^hel"

“-m 1” 将在每个文件中找到第一个匹配项后停止 grep。 - Mike Clark

2

ERE 不支持 \A,但是 PCRE 支持,因此如果可用,可以使用 grep -P 与相同的正则表达式:

grep -P '\Ahel\b' file
hel           string1

很重要的一点是使用单词边界\b来限制匹配hello

在ERE中,您也可以使用以下方式:

egrep '^hel\b' 
hel           string1

似乎-P对我不起作用。这是我做的:grep -E '^hel\b',它有效。为什么\b有效而$\z无效? - darksky
2
\b 是用于单词边界的。在您的情况下,$ 不起作用,因为它表示行尾,而行并不是紧接着 hel 结束的。同样适用于 \z(虽然 ERE 不支持它)。 - anubhava

1

我认为 \A 匹配字符串的开头,不管在它之前有什么字符都无所谓。为什么在字符串前面有空格时,\A 停止匹配?

\A 匹配文本的开头,当你的文本中有一个或多个行时,它不会匹配行的开头。

无论如何,grep 不支持 \A,因此您需要使用 ^,与 \A 相反,在多行模式下匹配每行的开头。


0
使用 awk
awk '$1=="hel"' file

顺便说一下,你不需要使用 cat 命令来配合 grep 命令,可以直接使用 grep '正则表达式' 文件名 命令。


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