How to grep for the whole word
UnixGrepUnix 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
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\>' .