The Regex pattern for this is (https://regexr.com/7b8g0):
(\s|^)-someword(\s|$)
A lot of shells freak out about these ()\|
so you'll have to fiddle with quotes and escapes a bit. For example fish seems to like \\s
but zsh likes \s
.
With ripgrep and fish, it's pretty easy to implement:
$ bat word.txt --style=numbers
1 word1 -someword word2
2 -someword word1
3 word1 -someword
4 -someword
5 s-someword
6 -somewordd
7 \s-someword
$ bat word.txt | rg '(\\s|^)-someword(\\s|$)' --only-matching --line-number
1: -someword
2:-someword
3: -someword
4:-someword
$ bat word.txt | rg '(\\s|^)-someword(\\s|$)' --line-number -v
5:s-someword
6:-somewordd
7:\s-someword
(I added \s-someword
and -v
to address some concerns in comments.)
Note that the spaces become part of the match. To fix that in the regex, you'd have to add a capturing group around -someword
(easy) and then then tell rg
to return the first group (pffft...).
Because grep is ancient it won't process this "advanced" regex syntax by default. You need to add -E
.
$ bat word.txt | grep -E '(\\s|^)(-someword)(\\s|$)' -n
1:word1 -someword word2
2:-someword word1
3:word1 -someword
4:-someword
$ bat word.txt | grep -v -E '(\\s|^)(-someword)(\\s|$)' -n
5:s-someword
6:-somewordd
7:\s-someword
Frankly, if you live in a year starting with 2, you should probably alias grep
to grep -E
anyway. Or just use rg
.