如何在Bash / Grep中删除单引号?

时间:2011-08-31 08:37:34

标签: linux bash escaping grep

我想用grep搜索一个如下所示的字符串:

something ~* 'bla'

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

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

什么是正确的搜索?

4 个答案:

答案 0 :(得分:42)

如果你需要在引号中用引号查找引号,那么就会有丑陋的构造。

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

: - )

答案 1 :(得分:13)

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

适合我。

  • 转义第一个*以匹配文字*,而不是将其设为零或多匹配字符:
    ~*会匹配零次或多次~~\*~*
  • 之后的something表达式匹配
  • :alnum:周围使用双括号(参见示例here
  • *之后使用[[:alnum::]]不仅可以匹配单引号之间的一个字符,还可以匹配其中几个
  • 单引号根本不必转义,因为它们包含在受双引号限制的表达式中。

答案 2 :(得分:1)

  • 字符类使用[[:alnum:]](两个括号)
  • 指定
  • [[:alnum:]]仅匹配一个字符。匹配零个或多个字符[[:alnum:]]*
  • 您可以使用" "引用正则表达式:

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

利玛

答案 3 :(得分:0)

根据您的表达,您首先使用',然后使用"。如果要转义单引号,可以使用'并转义它们,或使用双引号。另外,作为Matteo注释,字符类具有双方括号:

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

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