Mylić o granicy słów

13

Dużo to badam, ale nadal nie jestem tego pewien. Co oznacza granica słów ? Co to robi?

Czy na przykład ktoś mógłby mi wyjaśnić to polecenie?

egrep '\b[A-Z]+\b' filename.sh
użytkownik36683
źródło
1
„Granica słowa” to wszystko, co narzędzie definiuje jako takie ... niektórzy uważają, że nospace / space lub space / nospace to granica słów, inni uważają „słowo” za złożone [azA-Z0-9_]. Sprawdź instrukcję pod kątem egrep(1)być może podwojenia używanych wyrażeń regularnych.
vonbrand,

Odpowiedzi:

12

Jak opisano tutaj , na przykład, pasuje między słowami:

Istnieją trzy różne pozycje, które kwalifikują się jako granice słów:

  1. Przed pierwszym znakiem w ciągu, jeśli pierwszy znak jest znakiem słownym.
  2. Po ostatnim znaku w ciągu, jeśli ostatni znak jest znakiem słownym.
  3. Pomiędzy dwoma znakami w ciągu, gdzie jeden jest znakiem słownym, a drugi nie jest znakiem słownym.

Oto przykłady każdego z tych przypadków:

  1. W przypadku ciągu foobarpierwsza wielkość liter jest zgodna

     foobar
    ^-----here
    
  2. W przypadku ciągu foobardruga wielkość liter jest zgodna

    foobar
          ^--here
    
  3. W przypadku ciągu foo bartrzeci przypadek będzie pasował

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

To, co kwalifikuje się jako znak słowa, zależy od konkretnej implementacji wyrażenia regularnego. Jednak we wszystkich przypadkach litery ( [a-z]i [A-Z]), cyfry ( [0-9]) i _są uważane za znaki słowne.


Tak więc przykładowe wyrażenie regularne, które napisałeś ( \b[A-Z]+\b), oznacza znalezienie najdłuższego ciągu między dwoma granicami słów i składającego się wyłącznie z wielkich liter. Łatwiej wyjaśnić to na przykładzie:

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
źródło
Doskonałe wyjaśnienie, pamiętaj, że Solaris egrep(ani /usr/xpg4/bin/egrep) nie traktuje \btego w ten sposób. Na przykład echo "FOOBAR" | egrep '\b[A-Z]+\b'nie pasuje.
Peter
0
egrep '\b[A-Z]+\b' filename.sh

Rozbijmy to:

  1. [A-Z]reprezentuje dowolny znak w klasie znaków [ABCDEFGHIJKLMNOPQRSTUVWXYZ].
  2. [A-Z]+reprezentuje jedno lub więcej wystąpień wielkich liter. Przykład dopasowania byłoby: A, HELLO, IS, I, ELEPHANT, itd.
  3. '\bINDIA\b': jest dokładnie jak CAŁE SŁOWO, szukając słowa INDIAwielkimi literami. Byłoby nie pasuje INDIANA. Stosując tę ​​samą zasadę - '\b[A-Z]+\b'szukałby całych słów zawierających jedną lub więcej liter wielkimi literami.
  4. W egrep '\b[A-Z]+\b' filename.shten sposób szukałby słów zawierających jedną lub więcej liter wielkimi literami w pliku filename.sh.

\b - jest dokładnie jak wyszukiwanie całego słowa.

Sanket Rajgarhia
źródło