How to grep for the whole word

UnixGrep

Unix Problem Overview


I am using the following command to grep stuff in subdirs

find . | xargs grep -s 's:text'

However, this also finds stuff like <s:textfield name="sdfsf"...../>

What can I do to avoid that so it just finds stuff like <s:text name="sdfsdf"/>

OR for that matter....also finds <s:text somethingElse="lkjkj" name="lkkj"

basically s:text and name should be on same line....

Unix Solutions


Solution 1 - Unix

You want the -w option to specify that it's the end of a word.

find . | xargs grep -sw 's:text'

Solution 2 - Unix

Use \b to match on "word boundaries", which will make your search match on whole words only.

So your grep would look something like

grep -r "\bSTRING\b"

adding color and line numbers might help too

grep --color -rn "\bSTRING\b"

From http://www.regular-expressions.info/wordboundaries.html: > There are three different positions that qualify as word boundaries: > > * Before the first character in the string, if the first character is a > word character. > * After the last character in the string, if the last > character is a word character. > * Between two characters in the string, > where one is a word character and the other is not a word character.

Solution 3 - Unix

You can drop the xargs command by making grep search recursively. And you normally don't need the 's' flag. Hence:

grep -wr 's:text' 

Solution 4 - Unix

you could try rg, https://github.com/BurntSushi/ripgrep :

rg -w 's:text' . 

should do it

Solution 5 - Unix

If you just want to filter out the remainder text part, you can do this.

xargs grep -s 's:text '

This should find only s:text instances with a space after the last t. If you need to find s:text instances that only have a name element, either pipe your results to another grep expression, or use regex to filter only the elements you need.

Solution 6 - Unix

Use -w option for whole word match. Sample given below:

[binita@ubuntu ~]# a="abcd efg"
[binita@ubuntu ~]# echo $a
abcd efg
[binita@ubuntu ~]# echo $a | grep ab
abcd efg
[binita@ubuntu ~]# echo $a | grep -w  ab
[binita@ubuntu ~]# echo $a | grep -w  abcd
abcd efg

Solution 7 - Unix

This is another way of setting the boundaries of the word, note that it doesn't work without the quotes around it:

grep -r '\<s:text\>' .

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionjoshView Question on Stackoverflow
Solution 1 - UnixElle HView Answer on Stackoverflow
Solution 2 - Unixcs01View Answer on Stackoverflow
Solution 3 - UnixjocteeView Answer on Stackoverflow
Solution 4 - Unixms4720View Answer on Stackoverflow
Solution 5 - UnixStefan KendallView Answer on Stackoverflow
Solution 6 - UnixBinita BharatiView Answer on Stackoverflow
Solution 7 - UnixMyNameIsTrezView Answer on Stackoverflow