Почему экранированная одинарная кавычка не работает в 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?

2 ответа

Можно избежать одиночной кавычки с -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.

Извините, но вы не можете избежать одинарных кавычек внутри одинарных кавычек. Вам нужно будет использовать двойные кавычки. Вы можете доказать это себе, выполнив:

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

Ваша оболочка будет ожидать еще одну цитату.

Другие вопросы по тегам