1 votes

Bash : retourne tous les caractères entre la nième occurrence de deux chaînes différentes dans une chaîne de caractères.

Dans un bash script (sur Ubuntu 14.04) j'exécute la commande :

WP055="$(wget -qO - http://alerts.weather.gov/cap/wwaatmget.php?x=CAZ055&y=1)"

Dans la chaîne variable WP055, il y aura un nombre inconnu de paires "<title>" et "</title>". Je dois rechercher dans chacune de ces paires la chaîne "by NWS", ce qui signifie que cette chaîne particulière contient l'heure de début et de fin de l'avis météorologique particulier. Cette chaîne trouvée (tous les caractères entre les balises de titre d'ouverture et de fermeture) est ce que je cherche à capturer dans une autre variable afin de pouvoir la déposer dans un fichier index.html que le script construit.

J'avais prévu de parcourir la variable WP055 en boucle un nombre x de fois en analysant le texte de chaque paire de balises jusqu'à ce que je trouve la bonne.

Je ne peux pas rechercher "par NWS" dans le WP055 car il peut y avoir plus d'une occurrence dans le WP055 (plusieurs avis dans la chaîne WP055).

(La commande wget ci-dessus comportera certainement une chaîne "by NWS" dans la deuxième paire de titres jusqu'au 7 mars à 3h00 PST, date à laquelle l'avis de vent actuel sera annulé).

0voto

Un peu brutal, mais ça a l'air de fonctionner :

WP055="$(wget -qO - http://alerts.weather.gov/cap/wwaatmget.php?x=CAZ055&y=1)"
remainder=${WP055#*<title>}
if [ "$WP055" = "$remainder" ]
then
        echo "No title found"
        exit
fi
while true
do
        this_title=${remainder%%</title>*}
        if [ "$remainder" = "$this_title" ]
        then
                echo "</title> not found"
                exit
        fi
        if [[ "$this_title" == *"by NWS"* ]]
        then
                echo "$this_title contains \"by NWS\""
                # You probably want to do something here, like return.
        fi
        new_remainder=${remainder#*<title>}
        if [ "$new_remainder" = "$remainder" ]
        then
                echo "No more titles"
                exit
        fi
        remainder=$new_remainder
done

remainder=${WP055#*<title>} est une forme d'expansion des paramètres qui supprime un motif préfixe correspondant.  Ici, il définit remainder à

  • Le premier titre de la chaîne ( à l'exclusion de l'introduction <title> ),
  • la queue </title> et
  • tout le reste de la chaîne après cela (y compris tous les titres suivants).

Si "$WP055" = "$remainder" , cela signifie que le Shell n'a pas trouvé <title> dans la chaîne.

this_title=${remainder%%</title>*} De la même façon, l'ensemble this_title à être $remainder jusqu'à mais ne comprenant pas le premier </title> .

if [[ _something1_ == _something2_ ]] avec les doubles crochets ( [[…]] ) et le double signe égal ( == ), fait une correspondance de motif.  Tout le reste est de la répétition.

Cela peut se comporter bizarrement sur des entrées malformées ; c'est-à-dire un texte où <title> y </title> ne se produisent pas en paires alternées.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X