I want to search with grep for a string that looks like this:
something ~* 'bla'
I tried this, but the shell removes the single quotes argh..
grep -i '"something ~* '[:alnum:]'"' /var/log/syslog
What would be the correct search?
I want to search with grep for a string that looks like this:
something ~* 'bla'
I tried this, but the shell removes the single quotes argh..
grep -i '"something ~* '[:alnum:]'"' /var/log/syslog
What would be the correct search?
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
works for me.
*
to match a literal *
instead of making it the zero-or-more-matches character:~*
would match zero or more occurrences of ~
while~\*
matches the expression ~*
after something
:alnum:
(see example here)*
after [[:alnum::]]
to match not only one character between your single quotes but several of them If you do need to look for quotes in quotes in quotes, there are ugly constructs that will do it.
echo 'And I said, "he said WHAT?"'
works as expected, but for another level of nesting, the following doesn't work as expected:
echo 'She said, "And I said, \'he said WHAT?\'"'
Instead, you need to escape the inner single quotes outside the single-quoted string:
echo 'She said, "And I said, '\''he said WHAT?'\''"'
Or, if you prefer:
echo 'She said, "And I said, '"'"'he said WHAT?'"'"'"'
It ain't pretty, but it works. :)
Of course, all this is moot if you put things in variables.
[ghoti@pc ~]$ i_said="he said WHAT?"
[ghoti@pc ~]$ she_said="And I said, '$i_said'"
[ghoti@pc ~]$ printf 'She said: "%s"\n' "$she_said"
She said: "And I said, 'he said WHAT?'"
[ghoti@pc ~]$
:-)
[[:alnum:]]
(two brackets)[[:alnum:]]
is matching only one character. To match zero or more characters [[:alnum:]]*
you can just use " "
to quote the regex:
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
Matteo
It seems as per your expression, that you are using first '
, then "
. If you want to escape the single quotes, you can either use '
and escape them, or use double quotes. Also, as Matteo comments, character classes have double square brackets Either:
grep -i "something \~\* '[[:alnum:]]+'" /var/log/syslog
or
grep -i 'something ~* \'[[:alnum:]]+\'' /var/log/syslog