web-dev-qa-db-fra.com

Problèmes avec "+" dans grep

J'essaie d'écrire une commande grep pour trouver des lignes comme celle ci-dessous dans un fichier texte volumineux:

<div class="node_thumbnail" data-type="file" name="GOPR0036.MP4_frame000001.jpg" data="813334c25191468c9f1c57afc99fde60" aid="133948" rel="/Files/ToolTipView?fileId=813334c25191468c9f1c57afc99fde60&pageNo=1&NoCache=101016083044" rev="topMiddle">

mais le symbole + semble causer des problèmes dans les commandes ci-dessous:

 grep 'data=[a-z,0-9,\"]' file

Beaucoup de hits

 grep 'data=[a-z,0-9,\"]+' file

Aucun résultat

7
Martin KS

Si vous voulez que + signifie "un ou plusieurs des atomes précédents", vous devez alors effectuer l'une des opérations suivantes:

  1. Utilisez -E (Expressions régulières étendues) (ou -P, PCRE):

    grep -E 'data=[a-z,0-9,\"]+' file
    
  2. Echap + pour qu'il soit traité spécialement dans les expressions régulières de base utilisées par défaut dans grep:

    grep 'data=[a-z,0-9,"]\+' file
    
14
muru

Points:

  • _+_ est un jeton ERE (expression régulière étendue), indiquant qu'un ou plusieurs des jetons précédents, peut être utilisé si l'option _-E_ de grep est utilisée ou avec un caractère d'échappement _(\+_) en cas de BRE (regex basique), c’est-à-dire uniquement grep

  • La classe de caractères _[a-z,0-9,\"]_ correspond à n'importe lequel des caractères compris entre _[a-z]_, _[0-9]_, _,_ ou _"_. Cela peut ne pas être ce que vous voulez

  • Normalement, grep affiche la ligne entière. Si vous souhaitez uniquement afficher la partie correspondante, utilisez l'option _-o_ de grep.


Sur la base de votre exemple, vous pouvez faire:

_grep -E '\bdata=[a-z0-9"]+\b' file
_
  • _-E_ active ERE
  • _\b_ correspond aux bords de la chaîne, largeur zéro
  • _data=_ correspond à _data=_ littéralement
  • _[a-z0-9"]_ correspond à tout caractère de _[a-z]_, _[0-9]_ et _"_. _+_ correspond au jeton précédent une ou plusieurs fois

Votre modèle actuel, même si vous le corrigez, sans _\b_, cela correspond aux faux positifs tels que _foo fdata=2322ab_, _data=12AB_ et ainsi de suite.

Exemple:

_% grep -oE '\bdata=[a-z0-9"]+\b' <<<'<div class="node_thumbnail" data-type="file" name="GOPR0036.MP4_frame000001.jpg" data="813334c25191468c9f1c57afc99fde60" aid="133948" rel="/Files/ToolTipView?fileId=813334c25191468c9f1c57afc99fde60&pageNo=1&NoCache=101016083044" rev="topMiddle"'
data="813334c25191468c9f1c57afc99fde60
_
9
heemayl