2 votos

¿Por qué el comando "find -iregex" funciona pero "find -regex" con el indicador de insensibilidad a las mayúsculas y minúsculas "(?i)" no?

Según las páginas de manual, deberíamos poder utilizar regex con el sistema nativo find comando así:

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

Sin embargo, falla. He probado bastantes variaciones que también han fallado.

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.*"

No entiendo por qué, pero las comillas simples sí funcionan:

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

encuentra "frontline" o "Frontline"

El problema es que también tengo archivos que contienen FRONTLINE, Frontline, frontline.

man find dice:

Las opciones son las siguientes:

 -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 dice"

Opciones en línea (disponibles sólo para las ER ampliadas mejoradas) Al igual que el modo literal en línea mencionado anteriormente, se pueden activar y desactivar otras opciones para parte de un RE. (?o..)' activará las opciones especificadas en o.. (uno o más caracteres de opciones; véase más adelante), mientras que '(?-o..)' desactivará las opciones especificadas, y '(o..)'. desactivará las opciones especificadas, y '(?o1..-o2..)' activará el primer conjunto de conjunto de opciones, y desactivará el segundo conjunto.

 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.

...

El alcance del cambio de opción comienza inmediatamente después del derecho pero hasta el final de la subexpresión adjunta (si la hay). Así, por ejemplo, dado el RE '(fu(?i)bar)baz', la parte 'fu' coincide con sensible a mayúsculas y minúsculas, 'bar' coincide con insensible a mayúsculas y minúsculas, y 'baz' coincide con sensible a mayúsculas y minúsculas de nuevo (ya que está fuera del ámbito de la subexpresión en que se especificó la opción inline).

 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

Phill Puntos 126

Para encontrar todos los archivos, ejecute:

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

Tenga en cuenta que estoy usando el -iregex para que la expresión coincida sin distinguir entre mayúsculas y minúsculas.

En la madriguera del conejo de las expresiones regulares

Las expresiones regulares vienen en dos sabores :

  1. Básico (u obsoleto), originalmente apoyado por ed .
  2. Extendido (o moderno), apoyado por egrep y, al especificar el -E opción, por find y sed . Las expresiones regulares extendidas también pueden utilizarse con bash cuando se utiliza el =~ operador .

Pero hay más: como se explica en man re_format , la sintaxis de la expresión regular puede ser mejorada para soportar "características adicionales" :

Cuando el REG_ENHANCED se pasa a uno de los regcomp() variantes, se activan funciones adicionales

(?i) es un ejemplo de esta característica adicional, llamada opción en línea que está disponible para mejorado sólo expresiones regulares extendidas. Cuando se utiliza, la subexpresión después de (?i) se empareja insensiblemente. Por ejemplo, dada la expresión regular fu(?i)bar La parte "fu" coincidiría con las mayúsculas y minúsculas, mientras que "bar" lo haría con las minúsculas y minúsculas.

Desgraciadamente, aquí es donde las cosas se vuelven borrosas, porque depende del comando que se utilice para pasar internamente esa bandera al regcomp() familia de funciones y apoyar aquellas características adicionales .

Por ejemplo, egrep soporta las características adicionales:

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

mientras que find no parece apoyarlos:

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

¿Por qué fallan sus otros comandos?

find -E /Volumes/complete -regex "(?i).*frontline.*" intenta utilizar expresiones regulares mejoradas, que no son compatibles con find .

find -E /Volumes/complete -regex "\.*frontline.*\i" escapa de la primera . que hace que el primer carácter de la expresión sea un literal . . Esto nunca coincidirá, porque todas las líneas devueltas por find comienzan con la ruta especificada, es decir /Volumes/complete es decir, el primer carácter es / no . .

find -E /Volumes/SeedDrive/complete -regex "(?i:.*frontline.*)" intenta utilizar expresiones regulares mejoradas, que no son compatibles con find .

find -E /Volumes/SeedDrive/complete -regex "(\?i:.*frontline.*)" intenta utilizar expresiones regulares mejoradas, que no son compatibles con find .

find /Volumes/SeedDrive/complete -regex "*[fF]rontline.*" le falta un . al principio de la expresión regular. El uso de comillas dobles no es el culpable.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X