2012-02-15 5 views
4

J'essaie de modifier un script bash. Le courant de script contientregex match bash variable

print "<div class=\"title\">" $1 "</div>" 

$1 peut ressembler à:

Apprentice Historian (Level 1) 
Historian (Level 4) 
Master Historian (Level 7) 

Ce que je voudrais faire est d'ajouter une image qui est nommée la valeur « de base ». J'ai eu quelque chose comme ça à l'esprit:

print "<div class=\"icon\"><imgsrc=\"icons\" $1 ".png\"></div><div class=\"title\">" $1 "</div>" 

Cependant, dans ce cas, je voudrais revenir $1 seulement Historian. Je pensais que je pourrais utiliser une regex pour correspondre et sur $1 et ne garder que la partie dont j'ai besoin.

(Apprentice|Master)?\s(.*)\s(\(Level \d\)) 

Je sais que mon regex est pas tout à fait, l'apprenti idéalement/maître serait dans leur propre groupe de correspondance et ne sont pas liés à la base. Et je ne sais pas comment faire correspondre l'argument $1.

+3

[Le poney il vient ...] (http://stackoverflow.com/a/1732454/554546) –

+1

Merci pour le lien mais je ne suis pas en train d'analyser [x] html. Je suis en train de créer une sortie html basée sur quelques mots clés. – Brombomb

+0

@JackManey Je pense que l'OP demande à regex le type de chaîne 'Apprenti Historien (Niveau 1)' en utilisant bash. – bezmax

Répondre

9

en utilisant la correspondance des expressions rationnelles en bash:

for a in 'Apprentice Historian (Level 1)' 'Historian (Level 4)' 'Master Historian (Level 7)' ; do 
    set "$a" 
    echo " === $1 ===" 
    [[ $1 =~ (Apprentice|Master)?' '?(.*)' ('Level' '[0-9]+')' ]] \ 
     && echo ${BASH_REMATCH[${#BASH_REMATCH[@]}-1]} 
done 

La partie délicate est de récupérer le membre correct de BASH_REMATCH. Bash ne supporte pas les parenthèses non-capturantes, donc Historian est soit en dessous de 1 ou 2. Heureusement, nous savons que c'est le dernier.

0

Basé sur "Et je ne sais pas comment faire correspondre sur l'argument $ 1."

Est-ce que je vous ai bien compris si ce que vous demandez n'est pas de savoir si votre regex est correcte, mais plutôt comment effectuer la correspondance avec le contenu de votre variable bash?

matched_text=$(echo $yourbashvariablecontainingthetext | sed 's/your_regex/backreference_etc/') 

$ yourbashvariablecontainingthetext devrait être votre 1

5

échantillons shell pur $:

a="Historian (Level 1)" 
noParens=${a/ \(*/} 
lastWord=${noParens/[A-Za-z]* /} 

a="Muster Historian (Level 1)" 
noParens=${a/ \(*/} 
lastWord=${noParens/[A-Za-z]* /} 

(Ce sont les mêmes expressions dans les deux cas, juste répétés pour les tests faciles).