Reputation: 10191
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?
Upvotes: 29
Views: 42354
Reputation: 29021
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
Upvotes: 0
Reputation: 14930
character classes are specified with [[: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
Upvotes: 1
Reputation: 46846
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 ~]$
:-)
Upvotes: 44
Reputation: 67047
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 Upvotes: 14