【问题标题】:Can not extract the capture group with either sed or grep无法使用 sed 或 grep 提取捕获组
【发布时间】:2013-09-19 10:52:37
【问题描述】:

我想从键值对语法中提取值对,但我不能。
我试过的例子:

echo employee_id=1234 | sed 's/employee_id=\([0-9]+\)/\1/g'

但这给出了employee_id=1234 而不是1234,它实际上是捕获组。

我在这里做错了什么?我也试过了:

echo employee_id=1234| egrep -o employee_id=([0-9]+)

但没有成功。

【问题讨论】:

  • AFAIK sed 不支持“+”量词。相反,您必须键入两次: [0-9][0-9]* 就像 anubhava 在他的回答中所做的那样。
  • echo 'employee_id=1234' |剪切 -d '=' -f 2

标签: regex linux sed grep


【解决方案1】:

1.使用 grep -Eo:(因为 egrep 已弃用)

echo 'employee_id=1234' | grep -Eo '[0-9]+'

1234

2。使用grep -oP (PCRE):

echo 'employee_id=1234' | grep -oP 'employee_id=\K([0-9]+)'

1234

3.使用sed

echo 'employee_id=1234' | sed 's/^.*employee_id=\([0-9][0-9]*\).*$/\1/'

1234

【讨论】:

  • 您的答案都不相关。第一个我不能使用,因为我只需要employee_id= 之后的数字,第二个根本不起作用,第三个选择数字,如果我修改它,它会给出我需要的,但与我的不同之处在于你在数字部分使用*,而我使用+。为什么这很重要?
  • + 只允许在可用于sed -rsed -E 的扩展正则表达式中
  • 2 为我工作,作为获取 PHP 版本以用于 Ansible 剧本php -v | grep -P -o "^PHP\s\K([0-9]{1}\.?[0-9]{0,2}\.?[0-9]{0,2})\s"
  • \K 是做什么的?
  • @Nae: \K 是用于重置所有匹配信息的 PCRE 指令。
【解决方案2】:

为了扩展 anubhava 的答案编号 2,让 grep 返回捕获组的一般模式是:

$ regex="$precedes_regex\K($capture_regex)(?=$follows_regex)"
$ echo $some_string | grep -oP "$regex"

所以

# matches and returns b
$ echo "abc" | grep -oP "a\K(b)(?=c)" 
b 
# no match
$ echo "abc" | grep -oP "z\K(b)(?=c)"
# no match
$ echo "abc" | grep -oP "a\K(b)(?=d)"

【讨论】:

    【解决方案3】:

    使用awk

    echo 'employee_id=1234' | awk -F= '{print $2}'
    1234
    

    【讨论】:

      【解决方案4】:

      使用 sed -E 扩展正则表达式

          echo employee_id=1234 | sed -E 's/employee_id=([0-9]+)/\1/g'
      

      【讨论】:

        【解决方案5】:

        您特别要求sed,但如果您可以使用其他东西 - 任何符合 POSIX 的 shell 都可以进行参数扩展,而无需 fork/subshel​​l:

        foo='employee_id=1234'
        var=${foo%%=*}
        value=${foo#*=}
        

         

        $ echo "var=${var} value=${value}"
        var=employee_id value=1234
        

        【讨论】:

          猜你喜欢
          • 2013-09-09
          • 1970-01-01
          • 2021-11-28
          • 1970-01-01
          • 2018-08-23
          • 2015-06-11
          • 1970-01-01
          • 2017-12-13
          • 2017-03-05
          相关资源
          最近更新 更多