你是想让grep停止匹配,还是只关心第一个匹配。你可以使用 head 如果后来者是真的...
head
`grep stuff | head -n 1` Grep是一个基于行的工具,所以-m 1标志告诉grep在匹配了第一个line这与头部结合起来,在实践中是相当不错的。
Grep是一个基于行的工具,所以-m 1标志告诉grep在匹配了第一个line这与头部结合起来,在实践中是相当不错的。
-m 1
Ankur Agarwal :
这很有效!但我如何才能真正阻止grep在发现第一个匹配后进行匹配?好奇而已。
-m不会阻止grep在找到第一个匹配后进行匹配。
Andrew White :
起初我编辑了我的答案,包括-m标志,这是你在问题中已经有的,唉。使用-m 1会将搜索限制在只找到第一行,head会过滤,这在实践中应该是很好的。
我的问题是在一行中只匹配一个模式。我从我的问题中删除了-m 1。我是否可以在找到第一个匹配模式后阻止grep在一行中进行匹配?我只是好奇地想知道这是否可以做到。
我不认为你可以。它将在整个生产线上发挥作用。你有什么特别的理由吗?如果这对你来说是个障碍,你可以使用perl。
MacUsers 发布于 2018-12-15
0 人赞同
你需要进行分组。替换代码0】后面是准确的出现次数。替换代码1】来完成这项工作。 maci:~ san$ echo 12345 | grep -o '\([[:digit:]]\)\{4\}' Hope it helps. Cheers!!
你需要进行分组。替换代码0】后面是准确的出现次数。替换代码1】来完成这项工作。
maci:~ san$ echo 12345 | grep -o '\([[:digit:]]\)\{4\}' Hope it helps. Cheers!!
Hope it helps. Cheers!!
ijoseph :
这种语法意味着 up to 4 每行匹配。候选人希望 最多只能有1个 每行匹配,这将是 grep -o '\([[:digit:]]\)\{1,1\}' 。
grep -o '\([[:digit:]]\)\{1,1\}'
Jonathan Leffler 发布于 2018-12-15
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个数字后面是任何东西的字符串,只保留数字,并打印出来。
Use sed instead of grep :
sed
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个数字后面是任何东西的字符串,只保留数字,并打印出来。
这与行首的4个数字相匹配,后面是任何东西,只保留数字,并打印它们。 替换代码3】可以防止打印出其他行。 如果数字串也可能出现在行中,那么你需要一个稍微复杂的命令。
事实上,在理想情况下,你会使用PCRE正则表达式的sed,因为你真的需要一个非贪婪的匹配。 然而,在合理的近似情况下,你可以使用。 (对一个相当复杂的问题的半解决方法......现在被删除了!)
由于你想在行中获得最多 4 个数字的第一个字符串,只需使用【替换代码 0】来删除任何非数字,然后打印数字字符串。
echo abc12345 | sed -n '/^[^0-9]*\([0-9]\{1,4\}\).*/s//\1/p' 这匹配了一串非数字后面是1-4个数字后面是任何东西的字符串,只保留数字,并打印出来。
这匹配了一串非数字后面是1-4个数字后面是任何东西的字符串,只保留数字,并打印出来。
potong :
sed 's/^[^0-9]*\([0-9]\{1,4\}\).*/\1/p;d' 也许不那么忙?
sed 's/^[^0-9]*\([0-9]\{1,4\}\).*/\1/p;d'
koyae 发布于 2018-12-15
如果--如你的例子--你的数字表达式将出现在你要开始的字符串的开头,你可以直接添加一个行首锚 ^ 。 echo 12345 | grep -o '^\([[:digit:]]\)\{1,4\}' 根据你想要的确切数字,行末锚$可能也有帮助。
如果--如你的例子--你的数字表达式将出现在你要开始的字符串的开头,你可以直接添加一个行首锚 ^ 。
^
echo 12345 | grep -o '^\([[:digit:]]\)\{1,4\}' 根据你想要的确切数字,行末锚$可能也有帮助。
根据你想要的确切数字,行末锚$可能也有帮助。
$
prem 发布于 2018-12-15
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. 所以答案应该是。
grep手册上有关于这个主题的说明(见 "正则表达式 "一章)。
所以答案应该是。