Puisque vous devez faire correspondre le contenu sans l'inclure dans le résultat (doit correspondre name="
mais ne fait pas partie du résultat souhaité), une forme de correspondance de largeur nulle ou de capture de groupe est requise. Cela peut être fait facilement avec les outils suivants:
Perl
Avec Perl, vous pouvez utiliser l' n
option pour boucler ligne par ligne et imprimer le contenu d'un groupe de capture s'il correspond:
perl -ne 'print "$1\n" if /name="(.*?)"/' filename
Grep GNU
Si vous avez une version améliorée de grep, telle que GNU grep, vous pouvez avoir l' -P
option disponible. Cette option activera les expressions régulières de type Perl, vous permettant d'utiliser \K
ce qui est un raccourci vers l'arrière. Il réinitialisera la position de correspondance, donc tout ce qui est avant sa largeur zéro.
grep -Po 'name="\K.*?(?=")' filename
L' o
option fait que grep n'imprime que le texte correspondant, au lieu de la ligne entière.
Vim - Éditeur de texte
Une autre façon consiste à utiliser directement un éditeur de texte. Avec Vim, l'une des différentes manières d'y parvenir serait de supprimer les lignes sans
name=
puis d'extraire le contenu des lignes résultantes:
:v/.*name="\v([^"]+).*/d|%s//\1
Grep standard
Si vous n'avez pas accès à ces outils, pour une raison quelconque, quelque chose de similaire pourrait être réalisé avec grep standard. Cependant, sans le regard autour, il nécessitera un nettoyage plus tard:
grep -o 'name="[^"]*"' filename
Une note sur l'enregistrement des résultats
Dans toutes les commandes ci-dessus, les résultats seront envoyés à stdout
. Il est important de se rappeler que vous pouvez toujours les enregistrer en le redirigeant vers un fichier en ajoutant:
> result
à la fin de la commande.