Почему экранированная одинарная кавычка не работает в 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
Ваша оболочка будет ожидать еще одну цитату.