Hodně jsem to zkoumal, ale stále v tom nemám jasno. Co znamená hranice slova znamenat? Co to dělá?
Mohl by mi tedy například někdo vysvětlit tento příkaz?
egrep 'b[A-Z]+b' filename.sh
Přijatá odpověď:
Jak je popsáno například zde, odpovídá mezi slova:
Existují tři různé pozice, které se kvalifikují jako hranice slov:
- Před prvním znakem v řetězci, pokud je prvním znakem slovo.
- Za posledním znakem v řetězci, pokud je posledním znakem slovo.
- Mezi dvěma znaky v řetězci, kde jeden je znak slova a druhý není znak slova.
Zde jsou příklady každého z těchto případů:
-
Pro řetězec
foobar
, první případ odpovídáfoobar ^-----here
-
Pro řetězec
foobar
, druhý případ odpovídáfoobar ^--here
-
Pro řetězec
foo bar
, třetí případ bude odpovídatfoo bar ^--here, because space is not a word character
Co se kvalifikuje jako slovní znak, závisí na konkrétní implementaci regulárního výrazu. Ve všech případech však písmena ([a-z]
a [A-Z]
), čísla ([0-9]
) a _
jsou považovány za slovní znaky.
Takže příklad regulárního výrazu, který jste zveřejnili (b[A-Z]+b
) znamená najít nejdelší řetězec, který je mezi dvěma hranicemi slov a který se skládá pouze z velkých písmen. Mohlo by být snazší vysvětlit to na příkladu:
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