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&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&fid=78B06C3D-0158-4344-8A8B-5FB822CD44D8#viewer|prodID|Mactopia_Office2011]" id="78B06C3D-0158-4344-8A8B-5FB822CD44D8" class="download_link" href="
 ?pid=Mactopia_Office2011&fid=78B06C3D-0158-4344-8A8B-5FB822CD44D8#viewer
 ">Microsoft Office für Mac 2011 14.4.1-Update <span class="link_arrow">></span></a></p><p><a depEvents="DynamicDownloadsLinkClick[url|downloads?pid=Mactopia_Office2011&fid=F7B8C82F-71FF-4675-8924-DAB652BA6603#viewer|prodID|Mactopia_Office2011]" id="F7B8C82F-71FF-4675-8924-DAB652BA6603" class="download_link" href="
 ?pid=Mactopia_Office2011&fid=F7B8C82F-71FF-4675-8924-DAB652BA6603#viewer
 ">Microsoft Office für Mac 2011 14.3.9-Update <span class="link_arrow">></span></a></p><p><a depEvents="DynamicDownloadsLinkClick[url|downloads?pid=Mactopia_Office2011&fid=3BEDF6DC-1464-4D17-A5BB-C90F8FEF567C#viewer|prodID|Mactopia_Office2011]" id="3BEDF6DC-1464-4D17-A5BB-C90F8FEF567C" class="download_link" href="
 ?pid=Mactopia_Office2011&fid=3BEDF6DC-1464-4D17-A5BB-C90F8FEF567C#viewer
 ">Microsoft Office für Mac 2011 14.3.8-Update <span class="link_arrow">></span></a></p><p><a depEvents="DynamicDownloadsLinkClick[url|downloads?pid=Mactopia_Office2011&fid=3445FBDC-E092-4530-BF31-D60CECD53AB8#viewer|prodID|Mactopia_Office2011]" id="3445FBDC-E092-4530-BF31-D60CECD53AB8" class="download_link" href="
 ?pid=Mactopia_Office2011&fid=3445FBDC-E092-4530-BF31-D60CECD53AB8#viewer
 ">Microsoft Office für Mac 2011 14.3.7-Update <span class="link_arrow">></span></a></p><p><a depEvents="DynamicDownloadsLinkClick[url|downloads?pid=Mactopia_Office2011&fid=EF1E612F-D8E3-4628-9FE4-AD136F0DEBD3#viewer|prodID|Mactopia_Office2011]" id="EF1E612F-D8E3-4628-9FE4-AD136F0DEBD3" class="download_link" href="
 ?pid=Mactopia_Office2011&fid=EF1E612F-D8E3-4628-9FE4-AD136F0DEBD3#viewer
 ">
我正在尝试使用以下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,因为该解决方案将更干净、更易于维护。