sed正则表达式匹配第一次出现

时间:2014-05-21 13:09:05

标签: regex bash unix sed non-greedy

我有以下字符串:

<div class="downloadlist" id="Mactopia_Office2011"><p><a depEvents="DynamicDownloadsLinkClick[url|downloads?pid=Mactopia_Office2011&amp;fid=78B06C3D-0158-4344-8A8B-5FB822CD44D8#viewer|prodID|Mactopia_Office2011]" id="78B06C3D-0158-4344-8A8B-5FB822CD44D8" class="download_link" href="&#xD;&#xA;                          ?pid=Mactopia_Office2011&amp;fid=78B06C3D-0158-4344-8A8B-5FB822CD44D8#viewer&#xD;&#xA;                        ">Microsoft Office für Mac 2011 14.4.1-Update <span class="link_arrow">&gt;</span></a></p><p><a depEvents="DynamicDownloadsLinkClick[url|downloads?pid=Mactopia_Office2011&amp;fid=F7B8C82F-71FF-4675-8924-DAB652BA6603#viewer|prodID|Mactopia_Office2011]" id="F7B8C82F-71FF-4675-8924-DAB652BA6603" class="download_link" href="&#xD;&#xA;                          ?pid=Mactopia_Office2011&amp;fid=F7B8C82F-71FF-4675-8924-DAB652BA6603#viewer&#xD;&#xA;                        ">Microsoft Office für Mac 2011 14.3.9-Update <span class="link_arrow">&gt;</span></a></p><p><a depEvents="DynamicDownloadsLinkClick[url|downloads?pid=Mactopia_Office2011&amp;fid=3BEDF6DC-1464-4D17-A5BB-C90F8FEF567C#viewer|prodID|Mactopia_Office2011]" id="3BEDF6DC-1464-4D17-A5BB-C90F8FEF567C" class="download_link" href="&#xD;&#xA;                          ?pid=Mactopia_Office2011&amp;fid=3BEDF6DC-1464-4D17-A5BB-C90F8FEF567C#viewer&#xD;&#xA;                        ">Microsoft Office für Mac 2011 14.3.8-Update <span class="link_arrow">&gt;</span></a></p><p><a depEvents="DynamicDownloadsLinkClick[url|downloads?pid=Mactopia_Office2011&amp;fid=3445FBDC-E092-4530-BF31-D60CECD53AB8#viewer|prodID|Mactopia_Office2011]" id="3445FBDC-E092-4530-BF31-D60CECD53AB8" class="download_link" href="&#xD;&#xA;                          ?pid=Mactopia_Office2011&amp;fid=3445FBDC-E092-4530-BF31-D60CECD53AB8#viewer&#xD;&#xA;                        ">Microsoft Office für Mac 2011 14.3.7-Update <span class="link_arrow">&gt;</span></a></p><p><a depEvents="DynamicDownloadsLinkClick[url|downloads?pid=Mactopia_Office2011&amp;fid=EF1E612F-D8E3-4628-9FE4-AD136F0DEBD3#viewer|prodID|Mactopia_Office2011]" id="EF1E612F-D8E3-4628-9FE4-AD136F0DEBD3" class="download_link" href="&#xD;&#xA;                          ?pid=Mactopia_Office2011&amp;fid=EF1E612F-D8E3-4628-9FE4-AD136F0DEBD3#viewer&#xD;&#xA;                        ">

我正在尝试使用以下sed命令匹配此部分:“MicrosoftOfficefürMac2011 14.4.1-Update”:s/^.*Microsoft Office f.r Mac 2011 \([^ ]*\)-Update.*$/\1/ 不幸的是输出是14.3.7(所以最后一次出现)如何在第一次出现后停止输出,考虑到使用*?进行非贪婪匹配没有帮助?

5 个答案:

答案 0 :(得分:3)

您可以使用两个susbstitution命令,第一个用于删除第一个出现后的所有字符,第二个用于删除所有前导字符:

sed 's/\(Microsoft Office f.r Mac 2011 \([^ ]*\)-Update\).*$/\1/; s/^.*>//' infile

它产生:

Microsoft Office für Mac 2011 14.4.1-Update

答案 1 :(得分:2)

如果您与sed没有太多联系,您也可以

perl -pne 's/.*?(Microsoft Office.*?Update).*/$1/' file

grep -oP 'Microsoft Office.*?Update' file | head -1

答案 2 :(得分:1)

Perl支持非贪婪的正则表达式,所以你可以这样做:

perl -pe 's|.*?(Microsoft Office f.+?r Mac 2011 \S+-Update).*|$1|' string

给你:

Microsoft Office für Mac 2011 14.4.1-Update

我将.中的f.r更改为.+?,以便当“ü”计为多个字符时,它仍可正常工作。我还使用了\S(非空白)字符类。

答案 3 :(得分:1)

您可以使用awk从字符串中获取第一个数据,然后获得:

awk -F " &" '{gsub(/<[^>]*>/,"");$1=$1;print $1;exit}' file
Microsoft Office für Mac 2011 14.4.1-Update

答案 4 :(得分:1)

如果该行只有四个字符串(Microsoft Office für Mac 2011 14.4.1-Update),您也可以尝试此命令,

sed -rn 's/^.*[ ]+\">([^<]*)<.*[ ]+\">([^<]*)<.*[ ]+\">([^<]*)<.*[ ]+\">([^<]*)<.*$/\1/p' file.txt

输出:

Microsoft Office für Mac 2011 14.4.1-Update