¿Por qué la comilla simple escapada no funciona en grep?

0

Estoy tratando de hacer coincidir una cadena:

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

con:

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

No funciona: nada coincide.

Pero:

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

funciona muy bien:

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

¿Cuál es el problema con \'myApp\'?

¿Cómo escapar de una cita simple en grep / sed?

estático
fuente
-1 realmente deberías haber usado un ejemplo más simple para demostrar tu punto
barlop el

Respuestas:

3

uno puede escapar de comillas simples con -eopción y usando representación hexadecimal :

echo -e '\047'
> '

o en grep usando la representación hexadecimal y la -Popción:

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

ss64 como referencia:

-P
   --perl-regexp
       Interpret PATTERN as a Perl regular expression.
estático
fuente
Si está utilizando GNU grep, también podría haber reemplazado las comillas simples que 'encierran la expresión con comillas dobles "(2 caracteres modificados) y eliminando las barras invertidas \(3 caracteres eliminados). Prueba de copiar / pegarecho "* * * * * /usr/local/bin/growlnotify -t 'helloTitle' -m 'helloMessage' -n 'myApp' -sw" | grep "^[^#].*/usr/local/bin/growlnotify.*-n 'myApp'.*$"
adam
0

Lamento decirlo, pero no puede escapar de comillas simples dentro de comillas simples. Tendrás que usar comillas dobles. Puedes demostrártelo haciendo:

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

Su caparazón esperará otra cotización.

Patrice Levesque
fuente
2
Para aclarar: "\" no se puede usar para escapar de nada entre comillas simples. Este no es un problema grep / sed; Este es un problema de shell (bash, csh, etc.).
Scott