You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Joachim Ansorg edited this page Nov 12, 2021
·
4 revisions
Grep uses regex, but this looks like a glob.
Problematic code:
grep '*foo*'
Correct code:
grep 'foo'# or more explicitly, grep '.*foo.*'
Rationale:
In globs, * matches any number of any character.
In regex, * matches any number of the preceding character.
grep uses regex, not globs, so this means that grep '*foo' is nonsensical because there's no preceding character for *.
If the intention was to match "any number of characters followed by foo", use '.*foo'. Also note that since grep matches substrings, this will match "fishfood". Use anchors to prevent this, e.g. foo$.
This also means that f* will match "hello", because f* matches 0 (or more) "f"s and there are indeed 0 "f" characters in "hello". Again, use grep 'f' to find strings containing "f", or grep '^f' to find strings starting with "f".
Exceptions
If you're aware of the differences between globs and regex, you can ignore this message.