web-dev-qa-db-fra.com

Comment échapper aux guillemets simples dans Bash / Grep?

Je veux rechercher avec grep une chaîne qui ressemble à ceci:

something ~* 'bla'

J'ai essayé, mais le Shell supprime les guillemets simples argh ..

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

Quelle serait la bonne recherche?

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

travaille pour moi.

  • échapper au premier * pour correspondre à un littéral * au lieu d'en faire le caractère zéro ou plus correspond:
    ~* correspondrait à zéro ou plusieurs occurrences de ~ tandis que
    ~\* correspond à l'expression ~* après something
  • utilisez des crochets doubles autour de :alnum: (voir l'exemple ici )
  • utiliser un * après [[:alnum::]] pour faire correspondre non seulement un caractère entre vos guillemets simples mais plusieurs d'entre eux
  • les guillemets simples n'ont pas du tout besoin d'être échappés car ils sont contenus dans une expression limitée par des guillemets doubles.
13
eckes

Si vous avez besoin de chercher des guillemets entre guillemets, il y a des constructions laides qui le feront.

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

fonctionne comme prévu, mais pour un autre niveau d'imbrication, ce qui suit ne fonctionne pas comme prévu:

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

Au lieu de cela, vous devez échapper les guillemets simples intérieurs en dehors de la chaîne entre guillemets simples:

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

Ou, si vous préférez:

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

Ce n'est pas joli, mais ça marche. :)

Bien sûr, tout cela est théorique si vous mettez des choses dans des 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 ~]$ 

:-)

42
ghoti
  • les classes de caractères sont spécifiées avec [[:alnum:]] (deux crochets)
  • [[:alnum:]] ne correspond qu'à n caractère. Pour faire correspondre zéro ou plusieurs caractères [[:alnum:]]*
  • vous pouvez simplement utiliser " " pour citer l'expression régulière:

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

Matteo

1
Matteo

Il semble, selon votre expression, que vous utilisez d'abord ', puis ". Si vous voulez échapper aux guillemets simples, vous pouvez soit utiliser ' et leur échapper, ou utiliser des guillemets doubles. De plus, comme le fait remarquer Matteo, les classes de caractères ont des crochets doubles Soit:

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

ou

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