Confus au sujet de la limite des mots

13

J'ai fait beaucoup de recherches là-dessus, mais je ne suis toujours pas clair à ce sujet. Que signifie limite de mot ? Qu'est ce que ça fait?

Ainsi, par exemple, quelqu'un pourrait-il m'expliquer cette commande s'il vous plaît?

egrep '\b[A-Z]+\b' filename.sh
user36683
la source
1
Une "limite de mot" est tout ce que l'outil utilisé définit comme tel ... certains considèrent nospace / espace ou espace / nospace comme une limite de mot, d'autres considèrent un "mot" comme composé [azA-Z0-9_]. Consultez le manuel egrep(1), peut-être la doumentation des expressions régulières utilisées.
vonbrand

Réponses:

12

Comme décrit ici , par exemple, il correspond entre les mots:

Il existe trois positions différentes qui peuvent être considérées comme des limites de mots:

  1. Avant le premier caractère de la chaîne, si le premier caractère est un mot.
  2. Après le dernier caractère de la chaîne, si le dernier caractère est un mot.
  3. Entre deux caractères de la chaîne, où l'un est un caractère de mot et l'autre n'est pas un caractère de mot.

Voici des exemples de chacun de ces cas:

  1. Pour la chaîne foobar, le premier cas correspond

     foobar
    ^-----here
    
  2. Pour la chaîne foobar, le deuxième cas correspond

    foobar
          ^--here
    
  3. Pour la chaîne foo bar, le troisième cas correspondra

    foo bar
       ^--here, because space is not a word character
    

Ce qui est qualifié de caractère de mot dépend de l'implémentation de l'expression régulière spécifique. Dans tous les cas cependant, les lettres ( [a-z]et [A-Z]), les chiffres ( [0-9]) et _sont considérés comme des caractères de mot.


Ainsi, l'exemple d'expression régulière que vous avez publié ( \b[A-Z]+\b) signifie trouver la chaîne la plus longue qui se trouve entre deux limites de mot et qui se compose uniquement de lettres majuscules. Il pourrait être plus facile d'expliquer par l'exemple:

echo "FOOBAR" | egrep '\b[A-Z]+\b'   # Works
echo "FOO BAR" | egrep '\b[A-Z]+\b'  # Works
echo "aFOOBARb" | egrep '\b[A-Z]+\b' # Does not work, we want capitals only
echo "12345" | egrep '\b[A-Za]+\b'   # Does not work, no letters
echo "1FOOBAR2" | egrep '\b[A-Z]+\b' # Does not work, 1 and 2 are word chars
echo "_FOOBAR_" | egrep '\b[A-Z]+\b' # Does not work, _ is a word char
echo "#FOOBAR$" | egrep '\b[A-Z]+\b' # Works, # and $ are not word chars
terdon
la source
Excellente explication, notez simplement que Solaris egrep(nor /usr/xpg4/bin/egrep) ne traite pas de \bcette façon. Par exemple, echo "FOOBAR" | egrep '\b[A-Z]+\b'ne correspondrait pas.
Peter
0
egrep '\b[A-Z]+\b' filename.sh

Permet de le casser:

  1. [A-Z]représente n'importe quel caractère de la classe de caractères [ABCDEFGHIJKLMNOPQRSTUVWXYZ].
  2. [A-Z]+représente une ou plusieurs occurrences de caractères majuscules. Matches exemple serait: A, HELLO, IS, I, ELEPHANT, etc.
  3. '\bINDIA\b': est exactement comme une recherche de MOT ENTIER pour le mot INDIAen majuscule. Cela ne correspondrait PASINDIANA . Ainsi, appliquer le même principe - '\b[A-Z]+\b'rechercherait des mots entiers ayant une ou plusieurs lettres en majuscules.
  4. Ainsi egrep '\b[A-Z]+\b' filename.shrechercherait des mots ayant une ou plusieurs lettres tout en majuscule dans le fichier - filename.sh.

\b - c'est exactement comme une recherche de mots entiers.

Sanket Rajgarhia
la source