【问题标题】:How to extract value from shell and regex如何从 shell 和正则表达式中提取价值
【发布时间】:2021-05-01 10:56:43
【问题描述】:

我有一个字符串 "12G 39G 24% /dev" 。我必须提取值'24'。我使用了下面的正则表达式

grep '[0-9][0-9]%' -o

但我得到的输出是 24%。我只想要 24 作为输出并且不想要 '%' 字符。如何修改正则表达式脚本以仅提取 24 作为值?

【问题讨论】:

    标签: regex shell unix grep


    【解决方案1】:

    一种选择是再次使用grep 获取数字:

    grep -o '[0-9][0-9]%' | grep -o '[0-9][0-9]'
    

    但是,如果您想使用单个正则表达式来完成此操作,您可以使用以下内容:

    grep -Po '[0-9]{2}(?=%)'
    

    在这种情况下请注意-P 选项; vanilla grep 似乎不支持 (?=%) “环视”部分。

    【讨论】:

      【解决方案2】:

      不捕获某些内容的最常见方法是使用look-around assertions: 像这样使用它

      grep -oP '[0-9][0-9](?=%)'
      

      值得注意的是,GNU grep 支持-P 选项以启用与 Perl 兼容的正则表达式语法,但它不包含在 OS X 中。在 Linux 上,它将默认可用。一种解决方法是改用ack

      但我仍然建议在 OS X 上默认使用 GNU grep。它可以使用 Homebrew 安装在 OSX 上,命令为 brew grep install


      另外,请参阅How to match, but not capture, part of a regex?

      【讨论】:

        【解决方案3】:

        您可以使用 sed 作为替代方案:

        sed -rn 's/(^.*)([[:digit:]]{2})(%.*$)/\2/p' <<< "12G 39G 24% /dev"
        

        使用 -r 或 -E 启用正则表达式,然后将行拆分为用括号表示的 3 个部分。仅替换第二部分的行并打印。

        【讨论】:

          【解决方案4】:

          使用awk:

          awk '{print $3+0}'
          

          您要查找的值在第三个字段中,添加零会将字符串强制转换为数字,因此删除了%

          【讨论】:

            猜你喜欢
            • 2016-03-23
            • 1970-01-01
            • 2018-06-21
            • 2019-02-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-06
            相关资源
            最近更新 更多