2 votes

Pourquoi la commande "find -iregex" fonctionne-t-elle mais pas "find -regex" avec l'indicateur insensible à la casse "(?i)" ?

D'après les pages de manuel, nous devrions être en mesure d'utiliser les expressions rationnelles avec la fonction native find comme suit :

find -E /Volumes/complete -regex "(?i).*frontline.*"

Cependant, il échoue. J'ai essayé plusieurs variantes qui ont également échoué.

find -E /Volumes/complete -regex "\.*frontline.*\i"

find -E /Volumes/SeedDrive/complete -regex "(?i:.*frontline.*)" find: -regex: (?i:.*frontline.*): repetition-operator operand invalid

find -E /Volumes/SeedDrive/complete -regex "(\?i:.*frontline.*)"

find /Volumes/SeedDrive/complete -regex "*[fF]rontline.*"

Je ne comprends pas pourquoi, mais les guillemets simples fonctionnent :

find -E /Volumes/SeedDrive/complete -regex '.*[fF]rontline.*'

trouve "frontline" ou "Frontline"

Le problème est que j'ai aussi des fichiers qui contiennent FRONTLINE, Frontline, frontline.

man find dit :

Les options sont les suivantes :

 -E      Interpret regular expressions followed by -regex and -iregex
         primaries as extended (modern) regular expressions rather than
         basic regular expressions (BRE's).  The re_format(7) manual page
         fully describes both formats.

man re-format dit"

Options en ligne (disponibles uniquement pour les RE étendus améliorés) À l'instar du mode littéral en ligne mentionné ci-dessus, d'autres options peuvent être activées ou désactivées pour les parties de texte. être activées ou désactivées pour une partie d'un RE. L'option '(?o..)' activera les options spécifiées dans o.. (un ou plusieurs caractères d'options ; voir ci-dessous), tandis que '(?-o..)' activera les options spécifiées dans o.. (un ou plusieurs caractères d'options ; voir ci-dessous), tandis que désactivera les options spécifiées, et '(?o1..-o2..)' activera le premier ensemble d'options et désactivera la seconde.

 The available options are:

       i      Turning on this option will ignore case during matching, while
              turning off will restore case-sensitive matching.  If
              REG_ICASE was specified to regcomp(), this option can be use
              to turn that off.

...

Le champ d'application du changement d'option commence immédiatement après le droit mais jusqu'à la fin de la sous-expression englobante (s'il y en a une). Ainsi, par exemple, étant donné le RE '(fu(?i)bar)baz', la partie "fu" correspond à est sensible à la casse, "bar" est insensible à la casse et "baz" est sensible à la casse. sensible à la casse (puisqu'elle est en dehors de la portée de la sous-expression dans dans laquelle l'option inline a été spécifiée).

 The inline options syntax can be combined with the non-capturing
 parenthesized subexpression to limit the option scope to just that of the
 subexpression.  Then, for example, ‘fu(?i:bar)baz’ is similar to the
 previous example, except for the parenthesize subexpression around
 ‘fu(?i)bar’ in the previous example.

5voto

jaume Points 13186

Pour trouver tous les fichiers, exécutez :

find /Volumes/SeedDrive/complete -iregex ".*frontline.*"

Notez que j'utilise l'option -iregex pour faire correspondre l'expression sans tenir compte des majuscules et des minuscules.

Les expressions régulières dans le trou du lapin

Les expressions régulières se présentent sous la forme deux saveurs :

  1. Basique (ou obsolète), soutenu à l'origine par ed .
  2. Étendue (ou moderne), soutenue par egrep et, lorsqu'il s'agit de spécifier l'option -E option, par find y sed . Les expressions régulières étendues peuvent également être utilisées avec bash lors de l'utilisation du =~ opérateur .

Mais ce n'est pas tout : comme expliqué dans man re_format , la syntaxe des expressions régulières peut être améliorée pour prendre en charge des "fonctionnalités supplémentaires" :

Lorsque le REG_ENHANCED est transmis à l'une des options regcomp() des variantes, des fonctionnalités supplémentaires sont activées

(?i) est un exemple d'une telle caractéristique supplémentaire, appelée option inline qui est disponible pour améliorée uniquement les expressions régulières étendues. Lorsqu'elle est utilisée, la sous-expression qui suit (?i) est apparié insensiblement. Par exemple, étant donné l'expression régulière fu(?i)bar La partie "fu" correspondrait à la casse sensible tandis que "bar" correspondrait à la casse insensible.

Malheureusement, c'est là que les choses deviennent floues, car c'est à la commande que vous utilisez de passer ce drapeau en interne à la commande regcomp() de fonctions et prendre en charge ces fonctionnalités supplémentaires .

Par exemple, egrep prend en charge les fonctionnalités supplémentaires :

$ ls
fuBAR    fubar
$ ls | egrep -E 'fu(?i)bar'
fuBAR
fubar

alors que find ne semble pas les soutenir :

$ ls
fuBAR    fubar
$ find -E . -regex '.*fu(\?i)bar'
$

Pourquoi vos autres commandes échouent-elles ?

find -E /Volumes/complete -regex "(?i).*frontline.*" tente d'utiliser des expressions régulières améliorées, qui ne sont pas prises en charge par le système find .

find -E /Volumes/complete -regex "\.*frontline.*\i" échappe au premier . ce qui fait du premier caractère de l'expression un caractère littéral . . Cela ne correspondra jamais, car toutes les lignes renvoyées par find commencent par le chemin d'accès que vous avez spécifié, à savoir /Volumes/complete c'est-à-dire que le premier caractère est / , pas . .

find -E /Volumes/SeedDrive/complete -regex "(?i:.*frontline.*)" tente d'utiliser des expressions régulières améliorées, qui ne sont pas prises en charge par le système find .

find -E /Volumes/SeedDrive/complete -regex "(\?i:.*frontline.*)" tente d'utiliser des expressions régulières améliorées, qui ne sont pas prises en charge par le système find .

find /Volumes/SeedDrive/complete -regex "*[fF]rontline.*" Il manque un . au début de l'expression régulière. L'utilisation de guillemets doubles n'est pas en cause.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X