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
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
Odpowiedzi:
Jak opisano tutaj , na przykład, pasuje między słowami:
Istnieją trzy różne pozycje, które kwalifikują się jako granice słów:
- Przed pierwszym znakiem w ciągu, jeśli pierwszy znak jest znakiem słownym.
- Po ostatnim znaku w ciągu, jeśli ostatni znak jest znakiem słownym.
- 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:
W przypadku ciągu foobar
pierwsza wielkość liter jest zgodna
foobar
^-----here
W przypadku ciągu foobar
druga wielkość liter jest zgodna
foobar
^--here
W przypadku ciągu foo bar
trzeci 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
egrep
(ani /usr/xpg4/bin/egrep
) nie traktuje \b
tego w ten sposób. Na przykład echo "FOOBAR" | egrep '\b[A-Z]+\b'
nie pasuje.
egrep '\b[A-Z]+\b' filename.sh
Rozbijmy to:
[A-Z]
reprezentuje dowolny znak w klasie znaków
[ABCDEFGHIJKLMNOPQRSTUVWXYZ]
.[A-Z]+
reprezentuje jedno lub więcej wystąpień wielkich liter. Przykład dopasowania byłoby: A
, HELLO
, IS
, I
, ELEPHANT
, itd.'\bINDIA\b'
: jest dokładnie jak CAŁE SŁOWO, szukając słowa INDIA
wielkimi 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.egrep '\b[A-Z]+\b' filename.sh
ten 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.
[azA-Z0-9_]
. Sprawdź instrukcję pod kątemegrep(1)
być może podwojenia używanych wyrażeń regularnych.