web-dev-qa-db-fra.com

Extraire une chaîne spécifique après une chaîne donnée d'un fichier HTML à l'aide d'un script bash

J'ai un fichier HTML momcpy.html à partir duquel je veux extraire une chaîne spécifique après une chaîne donnée. Le contenu du fichier est comme:

<tr><br>
<th height="12" bgcolor="#808080"><label for="<br>
 LSCRM:Abhijeet<br>
 <br>
 MCRM:Bhargav<br>
 <br>
 TLGAPI:GAURAVAURAV<br>
 <br>
 MOM:MANIKA"></td><br>

Ceci est présent sur l'une des lignes de HTML.

Je veux extraire Manika et le stocker dans une variable. Donc, fondamentalement, je veux extraire la chaîne présente après MOM:, elle pourrait être dynamique.

J'ai essayé:

file='/home/websphe/Tomcat/webapps/MOM/web/momcpy.html'
  y=$( awk '$1=="MOM:"{print $2}' $file)
 echo "$y"

Mais ça n'a pas marché.

4
Abhijeet Anand

Je ne peux raisonnablement pas le recommander, car l'analyse de HTML avec regex risque de ne pas bien se terminer mais vous pourrez peut-être obtenir la chaîne MANIKAavec

sed -nr '/MOM:/ s/.*MOM:([^"]+).*/\1/p' file

Cela fonctionne quand même sur votre échantillon ...

Remarques

  • -n n'imprime rien jusqu'à ce que nous le demandions
  • -r utilisez ERE
  • /string/ trouver des lignes avec stringname__
  • s/old/new/ remplace oldpar newname__
  • .* n'importe quel nombre de caractères
  • ([^"]+) enregistrer des caractères qui ne sont pas "
  • \1 backreference aux caractères enregistrés
  • paffiche uniquement les lignes que nous avons modifiées
7
Zanna
grep -Po 'MOM:\K[^"]+' file.html

Attention: ce n’est pas une solution très robuste; Et votre code HTML n'est pas valide

5
user216043

La chaîne que vous recherchez a toujours MOM: devant celle-ci, mais vous n'avez pas précisé si elle avait toujours " après celle-ci. Pour les besoins de cette réponse, je supposerai que vous recherchez des chaînes pouvant contenir des caractères alphabétiques minuscules ou majuscules, des chiffres ou des caractères de soulignement. Ceux-ci sont appelés caractères de mot dans la terminologie de expressions régulières . La correspondance de tels "mots" de texte est suffisamment utile pour que la plupart des dialectes d'expressions régulières possèdent des fonctionnalités permettant de le faire. Si ce n'est pas ce que vous voulez, vous pouvez modifier cette solution en conséquence ou vous pouvez utiliser les techniques décrites dans les autres réponses.

Je fais écho à de David Foerster , de Zanna , et de JJoao , de sages avertissements sur l'analyse de HTML avec regex et sur le fait que cela n'est pas robuste. S'il vous plaît soyez prudent, et demandez-vous si ce que vous avez demandé est vraiment exactement ce que vous voulez faire. Dans votre exemple de code, vous avez attribué le chemin d'accès au fichier d'entrée à la variable $file. Je suppose donc que cela a été fait. Vous avez affecté le résultat de votre commande à $y. Je vais donc en faire autant.

Avec grepname__

Ceci est similaire à méthode de JJoao , et vous pouvez également utiliser cette méthode avec la substitution de commande si l'expression régulière correspondante est plus adaptée à vos besoins.

y="$(grep -oPm1 'MOM:\K\w+' "$file")"

-oPm1 est juste un moyen plus compact d'écrire -o -P -m 1.

Notez que vous pouvez également ajouter -m1 à la commande dans réponse de JJoao afin qu'elle utilise uniquement les correspondances de la première ligne qui en contient.

Si la première ligne avec une correspondance contient plusieurs correspondances , cette méthode grepvous donne toutes . Par exemple, si cette ligne est MOM:MANIKA MOM:JANE"></td><br>, alors $y contiendra la valeur:

MANIKA
JANE

Avec sedname__

Cela ressemble à méthode de Zanna .

y="$(sed -rn '0,/.*MOM:(\w+).*/ s//\1/p' "$file")"

En plus d'être inclus comme une substitution de commande, les différences sont les suivantes:

  • s'arrête après la première ligne contenant une correspondance
  • faire correspondre un ou plusieurs caractères Word (\w+) au lieu de caractères jusqu'à un " ([^"]+)
  • consommez zéro ou plus de caractères arbitraires (.*) en premier, afin que MOM: ne doive pas apparaître au tout début de la ligne
  • utilisez une syntaxe plus compacte qui évite d’écrire deux fois le motif.

La technique que j'ai utilisée pour cela nécessite GNU sedname __ , mais c'est la sedNAME _ implémentée dans Ubuntu.

Si la première ligne avec une correspondance contient plusieurs correspondances , cette méthode sedvous donne seulement la dernière . De MOM:MANIKA MOM:JANE"></td><br> vous obtenez:

JANE
1
Eliah Kagan