【问题标题】:Unix regex get only the first matchUnix 正则表达式只得到第一个匹配项
【发布时间】:2017-05-28 19:22:57
【问题描述】:

我有以下文字:

NodeMetaData MapNodeId="105141" PageFormat="OsXml" UniqueIdentifier="fd0f9ade-88e1-4b04-b338-0a8884f66423" RelativePath="Test_03/AddressMap_MyAddressMap.os.xml" LastPulledRevision="-9223372036854775808 " LastPulledMd5="" LastSyncedMd5="7D0C294B9A7C09F17FD5AC0414179DD414649455297B8F73125D7FB5E39D647D" HasMergeConflicts="false" NodeMetaData MapNodeId="105142" 页面 eFormat="OsXml" UniqueIdentifier="85f55c40-f95c-47f2-9c97-d35881e8f762" RelativePath="Test_03/Struct_MyStruct.os.xml" LastPulledRevision="-922337203685477580 8" LastPulledMd5="" LastSyncedMd5="32364BCCBCD8AA9C47D8E09A3EB06667DD9476EB155F9411FA359EFA5C1A4F4F" HasMergeConflicts="false"

有两个 MapNodeId(见粗体),我只需要获取第一个并将其插入到文件中。 我使用了以下内容:

set WorkingCopyRI=`( sed -n 's/.*MapNodeId=\"// ; s/\" .*//p' Result.log)`

但是 var 包含两个 MapNodeId 的 id,我需要添加什么才能只获取第一个?

【问题讨论】:

    标签: regex shell sed


    【解决方案1】:

    您可以将;T;q 附加到您的脚本,使其在第二条s 指令第一次打印后退出。

    这是一种更清洁、更强大的方法来完成整个工作:

    sed -n '/MapNodeId=/ { s/^.*\sMapNodeId="\([^"]*\)"\s .*$/\1/p; q }'
    

    我假设您的 ID-s 不会包含双引号 - 如果可以,您将不得不修改组 #1 中的表达式。

    (此外,您的格式不提供关于您的文本是否出现在多行中的任何线索,但我假设MapNodeId="..." 部分出现在单独的行中,否则您不会遇到这个问题。)

    【讨论】:

      【解决方案2】:

      perl 方法:

      perl -ne 'print "$1\n" if /MapNodeId="([^"]+)"/' Result.log
      

      输出:

      105141 
      

      print "$1\n" - 打印第一个捕获的组值


      或者如果您有 grep PCRE 支持:

      grep -Po '.*MapNodeId="\K([^"]+)' Result.log | head -n 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多