web-dev-qa-db-fra.com

regex apt-file: échapper à un point

Je veux trouver tous les paquets qui fournissent un objet partagé contenant "ssl" dans le nom du fichier. La page de manuel apt-file dit:

--regexp | -x Traite le motif comme une expression régulière (Perl). Voir perlreref (1) pour plus de détails. Sans cette option, pattern est traité comme une chaîne littérale à rechercher.

Donc mon premier essai a été

apt-file search --regexp .*ssl.*\.so.*

Ceci, cependant, m'a donné des résultats tels que

witty-exemples:/usr/lib/Wt/examples/feature/client-ssl-auth/resources

qui n'a pas ".so" dans le nom du fichier.

J'ai joué un peu et suis venu avec

apt-file search --regexp .*ssl.*\\.so.*

c’est-à-dire que j’ai échappé à la barre oblique inverse qui était supposée échapper au point. Cela m'a donné les résultats que je voulais.

Quelqu'un pourrait-il expliquer pourquoi j'ai besoin d'une double barre oblique inversée dans ce cas?

3
langlauf.io

Vous avez besoin d'une double barre oblique inversée \\ car la barre oblique inverse unique n'est pas seulement le caractère d'échappement regex, mais également celui que votre shell utilise. Par exemple. vous échappez au point, qui au niveau Shell interprète simplement un point normal, qui est ensuite transmis à apt-get et manipule chaque caractère (comme le fait habituellement un point ordinaire).

La réponse est donc, tout d’abord, la chaîne est interprétée par le shell, où la barre oblique inverse a une signification, et après, elle est transmise à apt-get. Le moteur d'expression rationnelle d'apt-get interprète ensuite à nouveau la chaîne prétraitée. Là, la barre oblique inverse a été remplacée (et a également une signification légèrement différente).

Une autre solution consiste à mettre la regex entre guillemets comme dans:

apt-file search --regexp '.*ssl.*\.so.*'
4
con-f-use

Si vous n'utilisez pas de modèle entre guillemets, vous devez échapper à la barre oblique inverse pour le RegEx:

apt-file search --regexp .*ssl.*\\.so.*

Avec un motif cité, vous n’avez pas besoin de ça:

apt-file search --regexp '.*ssl.*\.so.*'

Exemple

$ apt-file search --regexp .*ssl.*\\.so.* > ~/tmp/bar
$ apt-file search --regexp '.*ssl.*\.so.*' > ~/tmp/foo
$ diff foo bar | wc -l
0
1
A.B.