Cuando ejecuto ls /directory | grep '[^term]'
en Bash obtengo una lista regular, como si el grep
comando se ignorara de alguna manera. Intenté lo mismo con egrep
, intenté usarlo con comillas dobles y simples, pero no obtuve mejores resultados. Cuando lo intento ls /directory | grep '^[term]
, obtengo todas las entradas que comienzan con el término, como se esperaba.
He probado este comando en un editor en línea, donde puedo probar mi expresión regular y funcionó como debería. Pero no en Bash. Entonces funciona en una simulación, pero no en la vida real.
Trabajo en Crunchbang Linux 10. ¡Espero que sea suficiente información y espero con ansias cada pista, porque no ejecutar en un nivel tan básico y perder horas de tiempo es realmente frustrante!
grep
líneas que comienzan con el término. ¿O quieres buscar líneas que no contengan término?Respuestas:
¿Estás seguro de que lo que quieres está sucediendo? Cuando corres
ls /directory | grep '[^term]'
, esencialmente estás buscando no las letras ter m. Esto significa que si un archivo tiene otras letras en su nombre, seguirá apareciendo en la salida dels
. Tome el siguiente directorio por ejemplo:Ahora si corro
ls |grep '^[brav]'
me sale lo siguiente:Como puede ver, no solo obtuve
brave
ybravo
también obtuvealpha
porque la clase de caracteres[]
obtendrá cualquier letra de esa lista.En consecuencia, si ejecuto
ls |grep '[^brav]'
obtendré todos los archivos que no contienen los caracteres brav en ningún lugar del nombre.Si observa que incluía la lista completa del directorio porque todos los archivos tenían al menos una letra que no estaba incluida en la clase de caracteres.
Entonces, como Kanvuanza dijo, para buscar el inverso del "término" en lugar de los caracteres
t e r m
que debes usargrep -v
.Por ejemplo:
Además, si no desea utilizar los archivos que tienen caracteres en la clase
grep -v '[term]'
. Eso evitará que aparezcan archivos que tengan alguno de esos caracteres. (Respuesta de Kanvuanza)Por ejemplo:
Como puede ver, no había archivos listados porque todos los archivos en este directorio incluían al menos una letra de esa clase.
Apéndice:
Quería agregar que usando PCRE es posible usar solo regex para filtrar usando expresiones de negación. Para ello se usaría algo conocido como un negativo de expresiones regulares de preanálisis:
(?!<regex>)
.Entonces, usando el ejemplo anterior, puede hacer algo como esto para obtener los resultados que desea sin usar
grep
banderas.Para deconstruir esa expresión regular, primero coincide en el inicio de una línea
^
y luego busca cadenas que no coincidanbrav
para seguir después. Soloalpha
,charlie
ydelta
coinciden para que sean los únicos que se imprimen.fuente
-v
opción. ¡Gracias por su apoyo! ¡Esta pregunta realmente arruinó mi tarde, donde tu respuesta ilumina mi noche!negative look-ahead regex
.Supongo que esa
grep -v
bandera hace lo que quieres. Desde la página del manual :Puede usar
ls /directory | grep -v [term]
para imprimir cualquier línea que no coincida.fuente
[^abc]
Pero estoy bastante seguro de que grep no admite negaciones de clase, excepto algunas estándar (por ejemplo[[:^digits:]]
). El apoyo de Grep para la negación es horrible !grep
el manejo de las clases de personajes está bien. Simplemente significa algo muy diferente de lo que (mal) entiendes.[abc]
significa uno dea
,b
oc
;[^abc]
significa todo menos lo anterior. Es un personaje