I want to search the content of a file that could contain for example:
name1
name2
name3
...
...
name10
name11
...
...
the search should match the string if it doesn't have a wildcard (*). for example :
grep -w name1 filename
it returns exactly what I want:
file1 #ignores file10 & file11 as no wildcard used
but when I use the same command but with wildcard (*), as follows:
grep -w name1* filename
it also returns file1 only. without file10 and file11. How can I match the string exactly as the first case and when a (*) is used it should include the others?
Note: I have seen some answers suggested using .* instead of * it worked but for my application the input is coming always in the form of * not .*
thank you in advance.
CodePudding user response:
grep
uses regex for pattern matching. grep -w 'name1*'
would make it match zero or more 1
s, so name1
and name11
would match.
If it only matches name1
for you it's because you have a file named name1
in the directory and the unquoted name1*
will be interpreted by the shell (globbing). Always use quotes around your arguments that contain special characters. If you use a variable, always put "
around it.
To make it match any name starting with name1
, make it
grep -w 'name1.*' filename
.
means "any character".*
means "any character, zero or more times".
If the input comes from some external source where *
is used as a wildcard, you need to change that string before calling grep.
Example:
search_str='name1*'
new_search_str="$(sed 's/\*/.*/g' <<< "$search_str")"
grep -w "$new_search_str" filename