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?
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
travaille pour moi.
*
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
:alnum:
(voir l'exemple ici )*
après [[:alnum::]]
pour faire correspondre non seulement un caractère entre vos guillemets simples mais plusieurs d'entre euxSi 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 ~]$
:-)
[[: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
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