如何用'(''开头的sed模式提取

时间:2017-08-01 18:38:51

标签: regex sed pattern-matching

xdpyinfo | grep dimensions的输出是

  dimensions:    2560x1600 pixels (676x423 millimeters)

通过sed -r 's/^[^0-9]*([0-9]+x[0-9]+).*$/\1/')进行管道确实会提取尺寸(2560x1600),但不会使用左括号。

如何使用sed获取milimiters(即646x423)中的尺寸?

2 个答案:

答案 0 :(得分:2)

您可以使用

sed -r 's/.*\(([0-9]+x[0-9]+).*/\1/'

查看online demo

<强>详情

  • .* - 尽可能多的0个字符
  • \( - 文字((与-r一起使用的POSIX ERE风格)
  • ([0-9]+x[0-9]+) - 第1组(后来引用\1反向引用):1+位,x,1 +位数
  • .* - 尽可能多的0个字符

请注意,您实际上可以省略^$,因为只有一行与sed匹配。

这是使用POSIX BRE正则表达式的等效解决方案:

sed 's/.*(\([0-9][0-9]*x[0-9][0-9]*\).*/\1/'

请注意,(表示POSIX BRE中的文字(字符,而\(...\)在此处定义了捕获组。由于POSIX BRE不支持+量词,因此您可以使用[0-9][0-9]*代替(1位和0位数)。

答案 1 :(得分:2)

如果您想在单个命令中提取它,那么您只需使用匹配重置正则表达式grep替换现有的gnu grep命令\K

xdpyinfo | grep -oP 'dimensions:.*\(\K\d+x\d+'

676x423

以上将需要gnu grep。如果您无法使用此功能,则可以将此grep管道与另一个grep一起使用:

xdpyinfo | grep -oE 'dimensions:.*\([0-9]+x[0-9]+' | grep -oE '[0-9]+x[0-9]+$'

如果您必须使用sed,请使用单个sed命令并减少grep

xdpyinfo | sed -nE '/dimensions/{s/.*\(([0-9]+x[0-9]+).*/\1/p;q;}'