регулярное выражение sed соответствует первому вхождению

У меня есть следующая строка:

<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;                        ">

Я пытаюсь сопоставить эту часть: «Microsoft Office für Mac 2011 14.4.1-Update», используя следующую команду sed: s/^.*Microsoft Office f.r Mac 2011 \([^ ]*\)-Update.*$/\1/ К сожалению, вывод 14.3.7 (поэтому последнее вхождение), как я могу остановить его после первого случай, учитывая, что использование *? для нежадного сопоставления не помогло?


person user3660894    schedule 21.05.2014    source источник
comment
будет способ проанализировать эту строку, используя sed, но это явно HTML. Рассматривали ли вы его разбор как таковой? Какие языки вам было бы интересно использовать?   -  person Tom Fenech    schedule 21.05.2014
comment
@TomFenech Он использует sed.   -  person Taemyr    schedule 21.05.2014
comment
@Taemyr Я вижу это. Я предполагаю, что было бы лучше использовать язык со встроенными возможностями для разбора HTML, так как решение будет намного чище и проще в обслуживании.   -  person Tom Fenech    schedule 21.05.2014


Ответы (5)


Вы можете использовать две команды подстановки: первая для удаления всех символов после первого появления, а вторая для удаления всех начальных символов:

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

Это дает:

Microsoft Office für Mac 2011 14.4.1-Update
person Birei    schedule 21.05.2014

Если вы не слишком привязаны к sed, вы также можете сделать

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

or

grep -oP 'Microsoft Office.*?Update' file | head -1
person terdon    schedule 21.05.2014

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 (без пробелов).

person Tom Fenech    schedule 21.05.2014

Вы можете просто взять первые данные из строки, используя awk, и вы получите:

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

Вы также можете попробовать эту команду, если в этой строке присутствуют только четыре строки (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 
person Avinash Raj    schedule 21.05.2014