相关文章推荐
regex
linux
bash
grep
Ankur Agarwal
Ankur Agarwal
发布于 2012-03-03
5 个回答
Andrew White
Andrew White
发布于 2018-12-15
已采纳
0 人赞同

你是想让grep停止匹配,还是只关心第一个匹配。你可以使用 head 如果后来者是真的...

`grep stuff | head -n 1` 

Grep是一个基于行的工具,所以-m 1标志告诉grep在匹配了第一个line这与头部结合起来,在实践中是相当不错的。

这很有效!但我如何才能真正阻止grep在发现第一个匹配后进行匹配?好奇而已。
-m不会阻止grep在找到第一个匹配后进行匹配。
起初我编辑了我的答案,包括-m标志,这是你在问题中已经有的,唉。使用-m 1会将搜索限制在只找到第一行,head会过滤,这在实践中应该是很好的。
我的问题是在一行中只匹配一个模式。我从我的问题中删除了-m 1。我是否可以在找到第一个匹配模式后阻止grep在一行中进行匹配?我只是好奇地想知道这是否可以做到。
我不认为你可以。它将在整个生产线上发挥作用。你有什么特别的理由吗?如果这对你来说是个障碍,你可以使用perl。
MacUsers
MacUsers
发布于 2018-12-15
0 人赞同

你需要进行分组。替换代码0】后面是准确的出现次数。替换代码1】来完成这项工作。

maci:~ san$ echo 12345 | grep -o '\([[:digit:]]\)\{4\}'

Hope it helps. Cheers!!

这种语法意味着 up to 4 每行匹配。候选人希望 最多只能有1个 每行匹配,这将是 grep -o '\([[:digit:]]\)\{1,1\}'
Jonathan Leffler
Jonathan Leffler
发布于 2018-12-15
0 人赞同

Use sed instead of grep :

echo 12345 | sed -n '/^\([0-9]\{1,4\}\).*/s//\1/p'

这与行首的4个数字相匹配,后面是任何东西,只保留数字,并打印它们。 替换代码3】可以防止打印出其他行。 如果数字串也可能出现在行中,那么你需要一个稍微复杂的命令。

事实上,在理想情况下,你会使用PCRE正则表达式的sed,因为你真的需要一个非贪婪的匹配。 然而,在合理的近似情况下,你可以使用。 (对一个相当复杂的问题的半解决方法......现在被删除了!)

由于你想在行中获得最多 4 个数字的第一个字符串,只需使用【替换代码 0】来删除任何非数字,然后打印数字字符串。

echo abc12345 | sed -n '/^[^0-9]*\([0-9]\{1,4\}\).*/s//\1/p'

这匹配了一串非数字后面是1-4个数字后面是任何东西的字符串,只保留数字,并打印出来。

sed 's/^[^0-9]*\([0-9]\{1,4\}\).*/\1/p;d' 也许不那么忙?
koyae
koyae
发布于 2018-12-15
0 人赞同

如果--如你的例子--你的数字表达式将出现在你要开始的字符串的开头,你可以直接添加一个行首锚 ^

echo 12345 | grep -o '^\([[:digit:]]\)\{1,4\}'

根据你想要的确切数字,行末锚$可能也有帮助。

prem
prem
发布于 2018-12-15
0 人赞同

grep手册上有关于这个主题的说明(见 "正则表达式 "一章)。

The preceding item is matched n or more times. {n,m} The preceding item is matched at least n times, but not more than m times.

所以答案应该是。

 
推荐文章