【问题标题】:How to extract with sed a pattern starting with '('如何使用 sed 提取以 '(' 开头的模式
【发布时间】:2018-01-08 18:24:11
【问题描述】:

xdpyinfo | grep dimensions 的输出是

  dimensions:    2560x1600 pixels (676x423 millimeters)

通过sed -r 's/^[^0-9]*([0-9]+x[0-9]+).*$/\1/') 管道确实会提取以像素为单位的尺寸 (2560x1600),但不适用于左括号。

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

【问题讨论】:

  • 用反斜杠转义括号。

标签: regex sed pattern-matching


【解决方案1】:

你可以使用

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+ 位)。

【讨论】:

    【解决方案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;}'
    

    【讨论】:

    • 没有安装ggrep,但是第二个选项没有输出任何东西。
    • 对于sed,我建议使用xdpyinfo | sed -nE '/dimensions/{s/.*\(([0-9]+x[0-9]+).*/\1/p;q;}'并减少grep
    • 现在您的问题更加完整,并针对完整的问题。
    • 出于好奇,您将如何使用这种格式提取以像素模式 (2560x1600) 为单位的尺寸?
    • xdpyinfo | sed -nE '/dimensions/{s/.* ([0-9]+x[0-9]+).*/\1/p;q;}' 应该可以解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2016-02-02
    • 2019-03-06
    相关资源
    最近更新 更多