Como escaping aspas simples no Bash / Grep?

Eu quero pesquisar com grep para uma string que se parece com isso:

something ~* 'bla' 

Eu tentei isso, mas o shell remove aspas simples.

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

Qual seria a pesquisa correta?

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

funciona para mim.

  • escape o primeiro * para corresponder a um literal * vez de torná-lo o caractere de zero ou mais correspondências:
    ~* corresponderia a zero ou mais ocorrências de ~ enquanto
    ~\* corresponde à expressão ~* depois de something
  • use parênteses duplos ao redor :alnum: (veja o exemplo aqui )
  • use um * after [[:alnum::]] para combinar não apenas um caractere entre suas aspas simples, mas vários deles
  • as aspas simples não precisam ser escapadas porque estão contidas em uma expressão que é limitada por aspas duplas.

Se você precisa procurar por aspas entre aspas, existem construções feias que o farão.

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

funciona como esperado, mas para outro nível de aninhamento, o seguinte não funciona como esperado:

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

Em vez disso, você precisa escaping das aspas simples internas fora da cadeia entre aspas simples:

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

Ou, se preferir:

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

Não é bonito, mas funciona. 🙂

Claro, tudo isso é discutível se você colocar as coisas em 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 ~]$ 

🙂

  • classs de caracteres são especificadas com [[:alnum:]] (dois colchetes)
  • [[:alnum:]] está combinando apenas um caractere. Para corresponder zero ou mais caracteres [[:alnum:]]*
  • você pode simplesmente usar " " para citar o regex:

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

Matteo

Parece que, de acordo com a sua expressão, você está usando primeiro ' , então " . Se você quiser escaping das aspas simples, use ' e escape ' , ou use aspas duplas. Além disso, como Matteo comenta, as classs de caracteres têm o dobro colchetes:

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

ou

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