Unix正则表达式只获得第一场比赛

时间:2017-05-28 19:22:57

标签: regex shell sed

我有以下文字:

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

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

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

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

2 个答案:

答案 0 :(得分:0)

您可以在脚本中附加;T;q,以便在第一次打印第二条s指令后退出。

这是一种更干净,更健壮的方式来完成整个事情:

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

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

(另外,你的格式不能说明你的文字是否出现在多行中,但我假设MapNodeId="..."部分出现在不同的行上,否则你就不会这样做了。有这个问题。)

答案 1 :(得分:0)

perl 方法:

My.List[!is.nan(My.List)]

输出:

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

105141 - 打印第一个捕获的组值

或者如果你有 grep PCRE 支持:

print "$1\n"