How to escape single quotes in Bash/Grep?

2019-01-03 10:59发布

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?

4条回答
2楼-- · 2019-01-03 11:15
  • 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
    

Matteo

查看更多
The star\"
3楼-- · 2019-01-03 11:27

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 ~]$ 

:-)

查看更多
贪生不怕死
4楼-- · 2019-01-03 11:28
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 ~* after something
  • 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.
查看更多
Luminary・发光体
5楼-- · 2019-01-03 11:33

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
查看更多
登录 后发表回答