How to escape single quotes in Bash/Grep?
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 ~]$
:-)
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
works for me.
- escape the first
*
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~*
aftersomething
- use double brackets around
:alnum:
(see example here) - use a
*
after[[:alnum::]]
to match not only one character between your single quotes but several of them - the single quotes don't have to be escaped at all because they are contained in an expression that is limited by double quotes.