正则表达式匹配单词后跟另一个带有特定后缀的单词

时间:2016-05-04 18:52:19

标签: regex grep

我需要一个grep正则表达式,我想在文本文件上运行。 grep命令应输出文本文件的每一行,其中包含一个单词(让该单词为foo)后跟一个空格,另一个单词以某个后缀结尾(让该后缀为ing

因此正则表达式应匹配以下序列:foo goingfoo walkingfoo running

请注意,ing之后的foo应位于下一个字词中。所以正则表达式匹配:foo asfd asdfing

我试过

grep -i "foo .*ing"

但这不仅与下一个单词匹配,如果ing位于foo之后的第二个单词中,它也会匹配。

5 个答案:

答案 0 :(得分:2)

如果您使用。*将匹配所有内容,则只会匹配文字:

"foo\s[a-zA-Z]+ing"

答案 1 :(得分:2)

假设您的单词不区分大小写,可以使用不敏感标记(?i)

你可以使用这样的正则表达式:

(?i)foo [a-z]*ing

<强> Working demo

顺便说一句,如果foo和您可以使用的下一个单词之间可以存在多个空格:

(?i)foo\s+[a-z]*ing

如果您认为ing不是一个词,那么您可以将上面的内容改进为:

(?i)foo\s+[a-z]+ing

Regular expression visualization

如果您希望grep支持Perl正则表达式,您可以使用:

grep -P '(?i)foo\s+[a-z]+ing'

答案 2 :(得分:2)

您可以使用grep -i "\bfoo [a-z]+ing\b" 它使用单词边界来确保单词只是foo,而不是kafoo,后面的单词实际上以ing结尾,如finding但不是binged

答案 3 :(得分:2)

您可以使用此grep命令匹配单词foo和以ing结尾的下一个单词:

grep -Ew 'foo[[:blank:]]+[^[:blank:]]+ing' file

<强>测试

cat <<'EOF' | grep -Ew 'foo[[:blank:]]+[^[:blank:]]+ing'
pqr foo going
bar foo walking
bar tofoo walking
foo running
abc def foo asdf asdfing
EOF

<强>输出:

pqr foo going
bar foo walking
foo running

答案 4 :(得分:1)

我使用egrep代替grep:

来使用这个简短的脚本
egrep -i "foo\s+\w+ing\b" foo.txt

直接等同于:

grep -Ei "foo\s+\w+ing\b" foo.txt

我想出的输入文件(诗歌,真的)看起来像这样:

I was a little under the weather,
so I decided to foo going, and that involved
a lot of foo walking, and maybe just a little
bit of foo running, but certainly no foo
dancing or anything like that, because nobody wants
to be caught dancing any kind of way, especially
the foo way!

输出如下:

so I decided to foo going, and that involved
a lot of foo walking, and maybe just a little
bit of foo running, but certainly no foo

根据我对说明的阅读,这是我期望看到的。