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é.
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 MANIKA
avec
sed -nr '/MOM:/ s/.*MOM:([^"]+).*/\1/p' file
Cela fonctionne quand même sur votre échantillon ...
-n
n'imprime rien jusqu'à ce que nous le demandions-r
utilisez ERE/string/
trouver des lignes avec string
name__s/old/new/
remplace old
par new
name__.*
n'importe quel nombre de caractères([^"]+)
enregistrer des caractères qui ne sont pas "
\1
backreference aux caractères enregistrésp
affiche uniquement les lignes que nous avons modifiéesgrep -Po 'MOM:\K[^"]+' file.html
Attention: ce n’est pas une solution très robuste; Et votre code HTML n'est pas valide
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.
grep
name__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
.
-o
imprime uniquement les correspondances, pas toute la ligne.-P
utilise PCRE , qui prend en charge \K
pour supprimer le texte recherché jusqu'à ce qu'il ne soit pas inclus dans le texte correspondant renvoyé.-m 1
s'arrête après la correspondance du motif une fois. De cette manière, vous n'attribuez que la première correspondance à la variable plutôt que plusieurs correspondances séparées par nouvelles lignes .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 grep
vous donne toutes . Par exemple, si cette ligne est MOM:MANIKA MOM:JANE"></td><br>
, alors $y
contiendra la valeur:
MANIKA
JANE
sed
name__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:
\w+
) au lieu de caractères jusqu'à un "
([^"]+
).*
) en premier, afin que MOM:
ne doive pas apparaître au tout début de la ligneLa technique que j'ai utilisée pour cela nécessite GNU sed
name __ , mais c'est la sed
NAME _ implémentée dans Ubuntu.
Si la première ligne avec une correspondance contient plusieurs correspondances , cette méthode sed
vous donne seulement la dernière . De MOM:MANIKA MOM:JANE"></td><br>
vous obtenez:
JANE