Zgodnie z dokumentacją GNU:
‘\<’ Match the empty string at the beginning of word.
‘\>’ Match the empty string at the end of word.
Mój / etc / fstab wygląda następująco:
/dev/sdb1 /media/fresh ext2 defaults 0 0
Chcę, aby grep zwrócił wartość PRAWDA / FAŁSZ dla istnienia / media / fresh. Starałem się używać \<
, a \>
ale to nie działa. Czemu?
egrep '\</media/fresh\>' /etc/fstab
Obejście:
egrep '[[:blank:]]/media/fresh[[:blank:]]' /etc/fstab
Ale wygląda brzydiej.
Mój grep to 2.5.1
grep
regular-expression
Felipe Alvarez
źródło
źródło
/
nie jest uważany za znak słowny, więc wyrażenie regularne nie pasuje - „\ b dopasowuje przed i po sekwencji alfanumerycznej” jest bardziej dokładne niż powiedzenie „przed i po słowie”Odpowiedzi:
\<
i\>
dopasuj pusty ciąg odpowiednio na początku i na końcu słowa, a tylko znaki składowe słowa to:Od
man grep
:Twój regex zawodzi, ponieważ
/
nie jest prawidłowym znakiem składającym się na słowo.Zamiast tego, mając wokół siebie spacje, możesz użyć
-w
opcjigrep
dopasowania słowa:Przykład:
źródło
Ten problem ze
\<
(i również\b
) dotyczy nie tylko/
, ale wszystkich znaków innych niż słowa. (tj. znaki inne niż[[:alnum:]]
i_
.)Problem polega na tym, że silnik wyrażeń regularnych zawsze omija znak niebędący słowem, na przykład
/
podczas wyszukiwania następnej kotwicy\<
. Dlatego nie należy umieszczać znaków innych niż słowa, takich jak/
zaraz po\<
. Jeśli to zrobisz, z założenia nic nie będzie pasować.Alternatywą dla
-w
opcji grep byłoby coś takiego:źródło