Regex sed正则表达式匹配首次出现

Regex sed正则表达式匹配首次出现,regex,bash,unix,sed,non-greedy,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="78B06

我有以下字符串:

<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命令匹配此部分:“Microsoft Office für Mac 2011 14.4.1-Update:
s/^.*Microsoft Office f.r Mac 2011\([^]*\)-Update.$/\1/

不幸的是,输出是14.3.7(所以是最后一次出现),考虑到对非贪婪匹配使用
*?
没有帮助,如何使它在第一次出现后停止?

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

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

Microsoft Office für Mac 2011 14.4.1-Update

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

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

Microsoft Office für Mac 2011 14.4.1-Update

如果您不太依赖于
sed
,您也可以这样做

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


如果您不太依赖于
sed
,您也可以这样做

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


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
(非空白)字符类。

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
(非空白)字符类。

您只需使用
awk
从字符串中获取第一个数据即可:

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

您只需使用
awk
从字符串中获取第一个数据,即可获得:

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

如果该行上只有四个字符串(
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
),您也可以尝试此命令

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

有一种方法可以使用
sed
解析这个“字符串”,但它显然是HTML。你有没有考虑过这样解析它?你对什么语言感兴趣?@TomFenech他在用sed.@Taemyr我看得出来。我建议最好使用一种具有内置功能的语言来解析HTML,因为解决方案将更干净、更易于维护。有一种方法可以使用
sed
解析这个“字符串”,但它显然是HTML。你有没有考虑过这样解析它?你对什么语言感兴趣?@TomFenech他在用sed.@Taemyr我看得出来。我建议最好使用一种具有内置功能的语言来解析HTML,因为该解决方案将更干净、更易于维护。