2012-06-13 13 views
7

Estoy tratando de utilizar una expresión regular con el comando grep de LinuxÁmbito de grep con expresiones regulares

(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$)) 

Cuando estoy intentando hacia fuera en https://www.regextester.com con el contenido de un archivo, estoy consiguiendo el resultado deseado , es decir, los campos obligatorios se están igualados, pero cuando estoy tratando de usarlo como

grep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1 

todo lo que da de mí es un nulo!

¿Cuál es el problema aquí?

Respuesta

2
pcregrep -M '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' 

hizo el truco :)

3

No creo que grep comprenda las clases de caracteres como \w y \s. Intente usar grep -E o egrep. (grep -E es equivalente a egrep, egrep es sólo más corto para escribir.)

Así que su comando sería:

egrep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1 
+0

eso es fresco, pero ¿cómo puedo hacer una búsqueda de varias líneas? grep asumiendo línea de acción consiste en la línea .. Quiero una búsqueda en varios línea .. Entonces, ¿hay alguna solución? –

+1

@KiranVemuri Esa es una pregunta diferente a la que planteaste aquí. Ese tema está cubierto por [esta pregunta SO] (http: // stackoverflow.com/questions/152708/how-can-i-search-for-a-multiline-pattern-in-a-file-use-pcregrep) –

+0

Por defecto, egrep tampoco comprende \ s o \ w. Sin embargo, puede usar el indicador --perl-regexp si PCRE se ha compilado en. –

0

grep(1) utiliza POSIX Basic Regular Expressions por defecto, y POSIX Extended Regular Expressions cuando se usa con la opción -E .

En POSIX Regular Expressions caracteres especiales no han escapado sin definir comportamiento cuando, ej. \s, y no hay sintaxis para concordancia no codiciosa, ej. +?. Además, en los BRE, los operadores + y | no están disponibles, y los paréntesis se deben escapar para realizar la agrupación.

El POSIX character classes[[:space:]] y [[:alnum:]_] son unas alternativas portátiles a \s y \w respectivamente.

Excluyendo el siguiente carácter a juego a partir de una repetición puede usarse para emular igualación no codicioso, ex. [^*]+?\w*: es equivalente a [^*[:alnum:]_:]+[[:alnum:]_]*:.

La expresión regular dada puede representarse como varios sobres de respuesta:

grep -e '^[[:space:]]*\*[[:space:]]\{1,\}\[ \][^*[:alnum:]_+]\{1,\}[[:alnum:]_]*:[^*]\{1,\}[[:digit:]]$' \ 
    -e '[^*]\{1,\}\.com\.au$' file1 

o un ERE:

grep -E '^[[:space:]]*\*[[:space:]]*\[ \][^*[:alnum:]_:]+[[:alnum:]_]*:[^*]+[[:digit:]]$|[^*]+\.com\.au$' \ 
    file1 

Tenga en cuenta que la implementación GNU de grep(1) permite para ambas clases de caracteres cortos (\s y \w) y la repetición no codiciosa (+?), como extensiones no portátiles.

Cuestiones relacionadas