【问题标题】:Print RegEx matches using SED in bash在 bash 中使用 SED 打印 RegEx 匹配
【发布时间】:2013-01-06 22:07:16
【问题描述】:

我有一个 XML 文件,该文件由一行组成。

我要做的是通过 Putty 从文件中提取“finalNumber”属性值。而不必下载副本并使用 notepad++ 进行搜索。

我已经建立了一个正则表达式,并在On-line Tool 上进行了测试,并尝试在sed 命令到duplicate grep functionality 中使用它。该命令运行但不返回任何内容。

正则表达式:

(?<=finalNumber=")(.*?)(?=")

sed 命令(不返回任何内容,预期为 28,请参阅文件提取):

sed -n '/(?<=finalNumber=")(.*?)(?=")/p' file.xml

文件提取:

...argo:finalizedDate="2012-02-09T00:00:00.000Z" argo:finalNumber="28" argo:revenueMonth=""...

我觉得我很接近(我可能是错的),我是在正确的路线上还是有更好的方法来实现输出?

【问题讨论】:

    标签: regex linux bash sed


    【解决方案1】:

    这里的老 grep 没有错。

    grep -E -o 'finalNumber="[0-9]+"' file.xml | grep -E -o '[0-9]+'
    

    -E 用于扩展正则表达式,-o 仅打印匹配部分。

    【讨论】:

    • 接受,因为当文件中有多个匹配项时,它会返回每次出现的情况,即未记录的请求。
    【解决方案2】:

    虽然您已经选择了答案,但您可以在纯 sed 中执行以下操作:

    sed -n 's/^.*finalNumber="\([[:digit:]]\+\)".*$/\1/p' <test
    

    输出:

    28
    

    这会用匹配号替换整行并打印(因为 p 会打印整行所以你必须替换整行)

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed -r 's/.*finalNumber="([^"]*)".*/\1/' file
      

      【讨论】:

        【解决方案4】:

        sed 不支持前瞻断言。不过 Perl 可以:

        perl -ne 'print $1 if /(?<=finalNumber=")(.*?)(?=")/'
        

        【讨论】:

          【解决方案5】:

          据我了解,这里不需要使用前瞻。 试试这个

          sed -n '/finalNumber="[[:digit:]]\+"/p'
          

          【讨论】:

          • 在我的机器上打印整行。
          猜你喜欢
          • 1970-01-01
          • 2013-07-04
          • 2023-04-03
          • 1970-01-01
          • 2017-04-13
          • 1970-01-01
          • 2012-10-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多