GNU/Linux >> Tutoriales Linux >  >> Linux

Problema(s) de expresiones regulares en Bash:[^negate] no parece funcionar

¿Estás seguro de que está sucediendo lo que quieres? Cuando ejecutas ls /directory | grep '[^term]' esencialmente estás buscando no las letras t e r m. Esto significa que si un archivo tiene otras letras en su nombre, seguirá apareciendo en la salida de ls . Tome el siguiente directorio por ejemplo:

$ ls
alpha  brave  bravo  charlie  delta

Ahora si ejecuto ls |grep '^[brav]' Obtengo lo siguiente:

$ ls |grep '^[brav]'
alpha
brave
bravo

Como puede ver, no solo obtuve brave y bravo También obtuve alpha porque la clase de carácter [] recibirá cualquier carta de esa lista.

En consecuencia, si ejecuto ls |grep '[^brav]' Obtendré todos los archivos que no contengan los caracteres b r a v en cualquier lugar en el nombre.

$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta

Si nota que incluía la lista completa del directorio porque todos los archivos tenían al menos uno letra que no estaba incluida en la clase de caracteres.

Entonces, como dijo Kanvuanza, buscar el inverso de "término" en lugar de los caracteres t e r m deberías hacerlo usando grep -v .

Por ejemplo:

$ ls |grep -v 'brav'
alpha
charlie
delta

Además, si no desea los archivos que tienen caracteres en la clase, use grep -v '[term]' . Eso evitará que aparezcan archivos que tengan alguno de esos caracteres. (Respuesta de Kanvuanza)

Por ejemplo:

$ ls |grep -v '[brav]'

Como puede ver, no había archivos en la lista porque todos los archivos en este directorio incluían al menos una letra de esa clase.

Anexo:

Quería agregar que usando PCRE es posible usar solo expresiones regulares para filtrar usando expresiones negativas. Para hacer esto, usaría algo conocido como una expresión regular de anticipación negativa:(?!<regex>) .

Entonces, usando el ejemplo anterior, puede hacer algo como esto para obtener los resultados que desea sin usar grep banderas.

$ ls | grep -P '^(?!brav)'
alpha
charlie
delta

Para deconstruir esa expresión regular, primero coincide con el comienzo de una línea ^ y luego busca cadenas que no coincidan con brav para seguir después. Solo alpha , charlie y delta coinciden, por lo que esos son los únicos que se imprimen.


Supongo que grep -v bandera hace lo que quieres. Desde la página del manual:

-v, --invert-match
    Invert the sense of matching, to select non-matching lines.

Puedes usar ls /directory | grep -v [term] para imprimir cualquier línea que no coincida.


Linux
  1. Expresiones regulares:juntándolo todo

  2. ¿La definición de una expresión regular?

  3. Bash + Verificar nombre por expresión regular?

  4. fundamentos de grep

  5. 6 ejemplos de expresiones condicionales de Bash (-e, -eq, -z, !=, [, [[ ..)

Expresión de secuencia Bash (rango)

Expresiones regulares en Grep (Regex)

LD_LIBRARY_PATH no parece funcionar

¿Por qué `\d` no funciona en expresiones regulares en sed?

chmod no funciona

Expresión regular con sed