Jai un fichier texte:

deiauk 1611516 afsdf 765 minkra 18415151 asdsf 4152 linkra sfsfdsfs sdfss 4555 deiauk1 sdfsfdsfs 1561 51 deiauk2 115151 5454 4 deiauk 1611516 afsdf ddfgfgd luktol1 4545 4 9 luktol 1 

et je veulent correspondre exactement à deiauk. Quand je fais ceci:

grep "deiauk" file.txt 

Jobtiens ce résultat:

deiauk 1611516 afsdf 765 deiauk1 sdfsfdsfs 1561 51 deiauk2 115151 5454 4 

mais je seulement besoin de ceci:

deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd 

Je sais quil y a loption « sa -w, mais ma chaîne doit alors être entière ligne.

Commentaires

  • Avez-vous réellement essayé grep -w? (Cette option est exactement dans ce but , et cela fonctionne pour moi.) – Remarque: loption -x correspond à toute la ligne.
  • " Je veux correspondre exactement à deiauk / " Jai seulement besoin de ceci: deiauk 1611516 afsdf 765 " – de quoi avez-vous besoin?

Réponse

Essayez lun des éléments suivants:

grep -w "deiauk" textfile grep "\<deiauk\>" textfile 

Commentaires

  • Si vous avez un tiret () à la fin de la chaîne ce script lapportera comme résultat, ce qui nétait pas prévu.
  • Corriger @Eve rt: Les mots nincluent que des caractères alpha, des chiffres et des traits de soulignement, donc si vous avez des abréviations ou dautres éléments coupés, cela ne fonctionne pas.
  • @Cyrus Jai appris le second en utilisant vi / vim * commande sur les mots.
  • Elle ne fonctionne pour aucun caractère spécial quelle a par exemple org.apache.avro avro greped avec org.apache.avro avro+mapred (essayé avec *)
  • Utilisez -wE pour correspondance de plusieurs mots (OU booléen)

Réponse

Essayez ceci avec GNU grep et marquez les limites des mots avec \b:

grep "\bdeiauk\b" file 

Résultat:

 deiauk 1611516 afsdf 765 

Voir: http://www.regular-expressions.info/wordboundaries.html

Commentaires

  • Merci mais pourquoi cela ne fonctionne pas pour moi? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
  • Essayez grep "\b${vard}\b" file.txt
  • ' ne fonctionne toujours pas: /
  • Vous ' aurez besoin de read: read -p "Enter login: " vard; grep "\b${vard}\b" file.txt

Réponse

Si votre grep prend en charge -P (PCRE), vous pouvez faire:

$ grep -P "(^|\s)\Kdeiauk(?=\s|$)" file.txt deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd 

Commentaires

  • Cest la seule réponse qui fonctionne avec des mots avec trait dunion.
  • Pourquoi \K ( PCRE réinitialisation du début du match) nécessaire? Cette solution proposée semble très bien fonctionner sans elle.

Réponse

En fonction de vos données réelles, vous pouvez recherchez le mot suivi dun espace:

grep "deiauk " file.txt 

Si vous savez quil doit être au début de la ligne, vérifiez-le:

grep "^deiauk " file.txt 

Commentaires

  • Malheureusement, toutes les réponses autres que celles-ci sont incorrectes.
  • @Shatu Merci! Laissez donc ' voir combien de temps il lui faut pour " remonter en haut " … Je ' suis curieux car jaime ajouter des réponses à de vieilles questions … Je pense que cest supposé que oui, mais jen doute. Ce serait juste bien pour moi, mais en fait utile pour les lecteurs. Pour en faire un bon exemple, puis-je vous demander décrire un commentaire résumant ce que les autres réponses manquent?
  • (1) Félicitations pour avoir atteint 10K rep. Vous avez maintenant le privilège de voir que cette réponse a été donnée auparavant et a été supprimée. (2) Il est toujours préférable de répondre à la question de manière aussi large que possible, en fonction de ce qui est dit, et de ne pas donner une réponse qui fonctionne uniquement pour les exemples de données. Il ressort des exemples de données de la question que les colonnes sont séparées par des espaces, mais cela n’est pas spécifié. Toutes les autres réponses fonctionneront également pour les colonnes séparées par des tabulations. (3) Vous avez évité la faille fatale dans la réponse (supprimée) de tachomi en ajoutant ^ – mais toutes les autres réponses fonctionnent… (suite)
  • ( Suite)… si la chaîne apparaît dans un champ autre que le premier. (4) De plus, toutes les autres réponses fonctionnent si «deiauk» est le dernier champ (cest-à-dire quil ny a rien après).

Réponse

Jai trouvé que -x fonctionnait pour moi.

Exemple

$ grep -inx -d skip "favicon.ico" * test.txt:1:favicon.ico 

Manuel Grep

-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $. 

Commentaires

  • Pour 1: 1 correspondant à toute la ligne contenant des tirets, -x la seule option. Par exemple, grep -w "abc" <<<"abc-hac101-bb0" correspondra, mais grep -x "abc" <<<"abc-hac101-bb0" ne le sera pas

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *