【问题标题】:Pcregrep using matching groups使用匹配组的 Pcregrep
【发布时间】:2014-05-13 10:22:13
【问题描述】:

我想使用一个简单的 bash 语法来 grep 范围内的数字。例如。从短语

range "7.2-55.0"

我想保存 start=7.2end=55.0

因为我知道一些 perl 正则表达式 (pcre),所以我尝试了:

echo 'range "7.2-55.0"' | pcregrep -o '^range \"(\S+)\"'
echo 'range "7.2-55.0"' | pcregrep -o '^range \"([0-9.-]+)\"'

这是行不通的。输出是整行。那我的错是什么?是否可以使用pcregrep 保存 2 个匹配组?

在搜索网页时,我发现了例如pcregrep -o1 但我似乎有另一个版本的工具,因为我只被允许使用 -o 选项(GNU Bash-3.2)。

【问题讨论】:

  • 不匹配任何内容。 \K 代表什么?
  • 顺便说一句。 grep -Ppcregrep 一样吗?
  • 不是 pcregrep 专家,但似乎没有只返回第一个捕获组的功能。从man page 开始,-o 选项只会让它返回找到匹配项的那一行——无论如何,你的匹配就是整行。
  • @Robin 那时可能有不同的版本,因为我在网上的示例中看到了 -o1-o2 选项。顺便提一句。我发现pcregrep 应该比grep -Pgrep -E 快。
  • 这是我开始考虑用 perl、awk 等做所有事情的地方,这样我就不必运行许多倍数的命令来提取所有细节(一组子进程每个值)。

标签: regex perl bash grep


【解决方案1】:

你可以用awk这样做

start=$(echo 'range "7.2-55.0"' | awk -F'["-]' '/range/ {print $2}')
end=$(echo 'range "7.2-55.0"' | awk -F'["-]' '/range/ {print $3}')
echo $start
7.2
echo $end
55.0

【讨论】:

  • +1 正在工作,谢谢。虽然它在定义匹配方面非常严格。而且我仍然会对 grep 不起作用的原因感兴趣。
  • 您可以添加一个搜索模式以确保它采用正确的行,例如awk -F'["-]' '/range/{print $2}'。无法帮助您grep 抱歉。
  • 再次感谢,也不知道这个搜索模式!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多