如何在Bash / Grep中转义单引号?

我想用grepsearch一个看起来像这样的string:

something ~* 'bla' 

我试过这个,但是shell删除了单引号argh ..

 grep -i '"something ~* '[:alnum:]'"' /var/log/syslog 

什么才是正确的search?

Solutions Collecting From Web of "如何在Bash / Grep中转义单引号?"

 grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog 

为我工作。

  • 逃避第一个*匹配文字*而不是使其成为零或更多的匹配字符:
    ~*会匹配0个或更多的〜while
    ~\*匹配表达式~*
  • 使用双括号:alnum:见这里的例子)
  • [[:alnum::]]之后使用*来匹配您的单引号之间的一个字符,而不是几个字符
  • 单引号根本不必转义,因为它们被包含在一个受双引号限制的表达式中。

如果你确实需要用引号引用引号,那么会有丑陋的结构。

 echo 'And I said, "he said WHAT?"' 

按预期工作,但是对于另一个嵌套层次,以下情况不能按预期工作

 echo 'She said, "And I said, \'he said WHAT?\'"' 

相反,您需要转义单引号字符串之外的内部单引号:

 echo 'She said, "And I said, '\''he said WHAT?'\''"' 

或者,如果您愿意:

 echo 'She said, "And I said, '"'"'he said WHAT?'"'"'"' 

这不是漂亮,但它的作品。 🙂

当然,如果你把东西放在变量中,这一切都是没有意义的。

 [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:]] (两个括号)
  • [[:alnum:]]只匹配一个字符。 匹配零个或多个字符[[:alnum:]]*
  • 你可以用" "引用正则表达式:

     grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog 

马特奥

如果你想逃避单引号,你可以使用'和转义它们,或者使用双引号。另外,作为Matteo注释,字符类有双方括号可以是:

 grep -i "something \~\* '[[:alnum:]]+'" /var/log/syslog 

要么

 grep -i 'something ~* \'[[:alnum:]]+\'' /var/log/syslog