¿Cómo escapar de comillas simples en Bash / Grep?

Quiero buscar con grep una cadena que se parece a esto:

something ~* 'bla' 

Intenté esto, pero el shell elimina las comillas simples argh ..

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

¿Cuál sería la búsqueda correcta?

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

funciona para mi.

  • escape el primero * para hacer coincidir un literal * lugar de hacerlo el carácter cero o más coincidencias:
    ~* coincidiría con cero o más apariciones de ~ mientras
    ~\* coincide con la expresión ~* después de something
  • usa doble corchetes alrededor :alnum: (mira el ejemplo aquí )
  • utilice un * después de [[:alnum::]] para [[:alnum::]] no solo un carácter entre sus comillas simples, sino varias.
  • las comillas simples no tienen que ser escapadas en absoluto porque están contenidas en una expresión que está limitada por comillas dobles.

Si necesita buscar citas entre comillas, hay construcciones feas que lo harán.

 echo 'And I said, "he said WHAT?"' 

funciona como se esperaba, pero para otro nivel de anidación, lo siguiente no funciona como se esperaba:

 echo 'She said, "And I said, \'he said WHAT?\'"' 

En su lugar, debe escapar de las comillas simples internas fuera de la cadena de una sola cita:

 echo 'She said, "And I said, '\''he said WHAT?'\''"' 

O, si lo prefiere:

 echo 'She said, "And I said, '"'"'he said WHAT?'"'"'"' 

No es bonito, pero funciona. 🙂

Por supuesto, todo esto es discutible si pones cosas en variables.

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

🙂

  • las clases de caracteres se especifican con [[:alnum:]] (dos corchetes)
  • [[:alnum:]] está haciendo coincidir solo un carácter. Para que coincida con cero o más caracteres [[:alnum:]]*
  • solo puede usar " " para citar la expresión regular:

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

Matteo

Según su expresión, parece que está usando primero ' , luego " . Si quiere escapar de las comillas simples, puede usar ' y escapar de ellas, o usar comillas dobles. Además, como comenta Matteo, las clases de caracteres tienen el doble corchetes O bien:

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

o

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