2017-02-08 3 views
0

J'ai un script bash simple. Il lit un tas de HTML à partir du fichier test.html et extrait une sous-chaîne, mais pour l'instant, il ne sort rien.Variables dans les expressions régulières expr

grep yt-lockup-content test.html | while read -r line; do 
     datasession=`expr "$line" : ".*data-sessionlink=\"\(.*\)\" >.*"`; 
     users=`expr "$line" : ".*data-sessionlink=\"$datasession\" >\(.*\)</a>.*"`; echo ${users} 
    done 

J'ai mis le doigt sur le problème étant que cela ne fonctionne pas avec la $datasession variable. Si je le remplace par le texte approprié du premier bloc de HTML cela fonctionne bien.

grep yt-lockup-content test.html | while read -r line; do 
    datasession=`expr "$line" : ".*data-sessionlink=\"\(.*\)\" >.*"`; 
    users=`expr "$line" : ".*data-sessionlink=\"itct=CJgBEJQ1GAMiEwjOnsu1ou_RAhVJdaoKHVzWA1Eojh4\" >\(.*\)</a>.*"`; echo ${users} 
done 

Des suggestions sur la façon de faire fonctionner mon idée?

test.html:

</div><div class="yt-lockup-content"><h3 class="yt-lockup-title polymer-title"><a href="/watch?v=dybBD1hbmF4" class=" yt-ui-ellipsis yt-ui-ellipsis-2 polymer-title-link yt-uix-sessionlink  spf-link " data-sessionlink="itct=CJgBEJQ1GAMiEwjOnsu1ou_RAhVJdaoKHVzWA1Eojh4yCmctaGlnaC10cnZaD0ZFd2hhdF90b193YXRjaA" title="Ellen&#39;s Comments on the Travel Ban" aria-describedby="description-id-183985" dir="ltr">Ellen&#39;s Comments on the Travel Ban</a><span class="accessible-description" id="description-id-183985"> - Duration: 2:44.</span></h3><div class="yt-lockup-byline polymer-byline"><a href="/user/TheEllenShow" class="g-hovercard yt-uix-sessionlink  spf-link " data-ytid="UCp0hYYBW6IMayGgR-WeoCvQ" data-sessionlink="itct=CJgBEJQ1GAMiEwjOnsu1ou_RAhVJdaoKHVzWA1Eojh4" >TheEllenShow</a>&nbsp;<span class="yt-uix-tooltip yt-channel-title-icon-verified yt-sprite" title="Verified"></span></div><div class="yt-lockup-meta polymer-metadata"><ul class="yt-lockup-meta-info"><li>855,335 views</li><li>1 day ago</li></ul></div></div></div></div></li><li class="yt-shelf-grid-item yt-uix-shelfslider-item"><div class="yt-lockup yt-lockup-grid yt-lockup-video vve-check clearfix" data-context-item-id="sAwFLtbc7_c" data-visibility-tracking="CJcBEJQ1GAQiEwjOnsu1ou_RAhVJdaoKHVzWA1Eojh5A99_ztu2lgYawAQ=="><div class="yt-lockup-dismissable"><div class="yt-lockup-thumbnail contains-addto polymer-thumbnail-padding"><a aria-hidden="true" href="/watch?v=sAwFLtbc7_c" class=" yt-uix-sessionlink  spf-link " data-sessionlink="itct=CJcBEJQ1GAQiEwjOnsu1ou_RAhVJdaoKHVzWA1Eojh4yCmctaGlnaC10cnZaD0ZFd2hhdF90b193YXRjaA" ><div class="yt-thumb video-thumb"><span class="yt-thumb-simple"> 
    <img width="196" data-ytimg="1" height="110" alt="" src="https://i.ytimg.com/vi/sAwFLtbc7_c/hqdefault.jpg?custom=true&amp;w=196&amp;h=110&amp;stc=true&amp;jpg444=true&amp;jpgq=90&amp;sp=68&amp;sigh=qC9IiuL6075XOXO7ipK_PmTwmx8" onload=";__ytRIL(this)" > 
<span class="video-time" aria-hidden="true">5:24</span></span></div></a> <span class="thumb-menu dark-overflow-action-menu video-actions"> 
    <button type="button" aria-expanded="false" class="yt-uix-button-reverse flip addto-watch-queue-menu spf-nolink hide-until-delayloaded yt-uix-button yt-uix-button-dark-overflow-action-menu yt-uix-button-size-default yt-uix-button-has-icon no-icon-markup yt-uix-button-empty" onclick=";return false;" aria-haspopup="true" ><span class="yt-uix-button-arrow yt-sprite"></span><ul class="watch-queue-thumb-menu yt-uix-button-menu yt-uix-button-menu-dark-overflow-action-menu hid"><li role="menuitem" class="overflow-menu-choice addto-watch-queue-menu-choice addto-watch-queue-play-next yt-uix-button-menu-item" data-action="play-next" onclick=";return false;" data-video-ids="sAwFLtbc7_c"><span class="addto-watch-queue-menu-text">Play next</span></li><li role="menuitem" class="overflow-menu-choice addto-watch-queue-menu-choice addto-watch-queue-play-now yt-uix-button-menu-item" data-action="play-now" onclick=";return false;" data-video-ids="sAwFLtbc7_c"><span class="addto-watch-queue-menu-text">Play now</span></li></ul></button> 
    </span> 

Le texte que je suis en train de sortir avec grep et expr est le nom d'utilisateur YouTube: TheEllenShow

+0

Vous n'avez pas besoin d'utiliser 'expr' dans' bash'; vous pouvez utiliser la commande conditionnelle avec l'opérateur '= ~' à la place. – chepner

+0

Désolé, je devrais spécifié. Je n'aime utiliser que grep et expr. – ns533

+0

Pourquoi? Avez-vous besoin de la compatibilité POSIX? Exécuter 'expr' deux fois sur chaque ligne est beaucoup plus lent que de laisser' bash' faire la correspondance en interne. – chepner

Répondre

0

La solution que je suis venu avec est la suivante. Gardez à l'esprit qu'il s'agit d'une solution «qui marche à peine» et que je ne l'utilise que pour compléter mon projet et passer à autre chose. Comme Chepener l'a dit, expr n'est pas un bon outil pour ce travail et je l'ai seulement utilisé parce que je devais le faire.

grep yt-lockup-content test.html | while read -r line; do 
     users=`expr "$line" : ".*[a-zA-Z0-9]\" >\(.*\)</a>[</div>?&nbsp;?]*"`; echo ${users} 
    done