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

问题描述 投票:0回答:4

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

something ~* 'bla'

我尝试过这个,但是 shell 删除了单引号。啊……

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

正确的搜索是什么?

linux bash escaping grep
4个回答
43
投票

如果您需要在引号中查找引号,有一些丑陋的构造可以做到这一点。

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

:-)


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

对我有用。

    转义第一个
  • *
     以匹配文字 
    *
    ,而不是使其成为零个或多个匹配字符:

    ~*
     将匹配零次或多次出现的 
    ~
     while

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

1
投票
  • 字符类别用

    [[:alnum:]]

    (两个括号)
    指定

  • [[:alnum:]]

     仅匹配 
    one 字符。匹配零个或多个字符 [[:alnum:]]*
    
    

  • 您可以使用

    " "

     来引用正则表达式:

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

0
投票
从你的表情看来,你先使用

'

,然后使用
"
。如果要转义单引号,可以使用 
'
 并转义它们,或者使用双引号。另外,正如 Matteo 所评论的,字符类有双方括号:

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

grep -i 'something ~* \'[[:alnum:]]+\'' /var/log/syslog
    
© www.soinside.com 2019 - 2024. All rights reserved.