为什么转义的单引号在 grep 中不起作用?

为什么转义的单引号在 grep 中不起作用?

我正在尝试匹配一个字符串:

* * * * * /usr/local/bin/growlnotify -t 'helloTitle' -m 'helloMessage' -n 'myApp' -sw

和:

crontab -l | grep '^[^#].*/usr/local/bin/growlnotify.*\-n \'myApp\'.*$'

它不起作用:没有匹配项。

但:

crontab -l | grep '^[^#].*/usr/local/bin/growlnotify.*\-n.*$'

效果很好:

* * * * * /usr/local/bin/growlnotify -t 'helloTitle' -m 'helloMessage' -n 'myApp' -sw

有什么问题\'myApp\'

如何在 grep/sed 中转义单引号?

答案1

可以使用-e选项并使用来转义单引号十六进制表示:

echo -e '\047'
> '

或者在 grep 中使用十六进制代表和-P选择:

crontab -l | grep -P '^.*/usr/local/bin/growlnotify.*\-n \047myApp\047.*$'
> * * * * * /usr/local/bin/growlnotify -t 'helloTitle' -m 'helloMessage' -n 'myApp' -sw

SS64作为参考:

-P
   --perl-regexp
       Interpret PATTERN as a Perl regular expression.

答案2

很抱歉,但您无法在单引号内转义单引号。您需要使用双引号。您可以通过以下方式亲自证明这一点:

echo '\'' <-- doesn't work

你的 shell 将会期待另一个引号。

相关内容