2011-01-25 17 views

Respuesta

39

La parte difícil es una expresión regular que incluye un guión como uno de los caracteres válidos en una clase de caracteres. El guión debe venir inmediatamente después del inicio de una clase de caracteres (normal) e inmediatamente después del símbolo de una clase de carácter negada. Si también necesita un corchete cuadrado, necesita el corchete cuadrado cerrado seguido del guión. Afortunadamente, solo necesitas dash, de ahí la notación elegida.

grep '^[-d]rwx.*[0-9]$' "[email protected]" 

Ver: Regular Expressions y grep para más detalles POSIX estándar.

+2

O 'grep -x '[-d] rwx. * [0-9]''. – ephemient

+0

En Linux, sí, o donde se usa GNU grep. La versión que cité funcionará en todas las variantes de Unix, lo que enviaría lo hace mejor. –

+2

'-x' es POSIX. Bracket following dash: '[[.-.] [.].]]' (Que, concedido, es menos legible que '[] -]'). Yo * creo * esto también es POSIX ... – ephemient

3

Probablemente desee egrep. Proveedores:

egrep '^[d-]rwx.*[0-9]$' usrLog.txt 
15

Parece como si estuvieras en el camino correcto ... El carácter ^ partidos a partir de la línea, y $ partidos de fin de línea. El patrón de Jonathan funcionará para usted ... solo quería darle la explicación detrás de él

+3

No del todo en el camino correcto, sin embargo. Es significativo observar que los caracteres dentro de una clase de caracteres '[]' se comportan de forma significativamente diferente a como lo harían en otras partes de la expresión regular. – ephemient

1

¿está analizando la salida de ls -l?

Si es así, y lo que desea es obtener el nombre del archivo

find . -iname "*[0-9]" 

Si no tiene otra opción, porque usrLog.txt es creado por algo/alguien más y que es absolutamente necesario utilizar este archivo, otras opciones incluir

awk '/^[-d].*[0-9]$/' file 

Rubí (1.9+)

ruby -ne 'print if /^[-d].*[0-9]$/' file 

Bash

while read -r line ; do case $line in [-d]*[0-9]) echo $line; esac; done < file 
4

Cabe señalar que el cursor (^) no solo se comportará de manera diferente dentro de los corchetes, sino que tendrá el resultado opuesto de colocarlo fuera de los corchetes. Colocando el cursor donde lo tienes buscará todas las cadenas que NO comiencen con el contenido que colocas entre corchetes. También querrás colocar un período antes del asterisco entre tus corchetes, como con grep, también actúa como un "comodín".

grep ^[.rwx].*[0-9]$ 

Esto debería funcionar para usted, he notado que algunos carteles utilizan una clase de caracteres en sus expresiones, que es un método eficaz también, pero no se está usando cualquiera en su expresión original por lo que estoy tratando de conseguir uno lo más cerca posible de ustedes explicando cada cambio menor en el camino para que se entienda mejor. ¿Cómo podemos aprender de otra manera?

Cuestiones relacionadas