Tengo esta expresión regular:
(?<=prefix).*$
que devuelve cualquier carácter que sigue al "prefijo" de la cadena y funciona bien en cualquier motor de expresiones regulares en línea (por ejemplo, https://regex101.com ). El problema es cuando uso esa expresión regular en bash:
grep '(?<=prefix).*$' <<< prefixSTRING
No coincide con nada. ¿Por qué esa expresión regular no funciona con grep?
grep
regular-expression
mark009
fuente
fuente

.*$coincide con cualquier cadena hasta el final de la línea (o el final de la cadena), no cualquier carácter.Respuestas:
Parece que ha definido la expresión regular correcta, pero no ha establecido las marcas suficientes en la línea de comandos para
grepcomprenderla. Porque por defectogrepsoporta BRE y con-Eflag lo hace ERE. Lo que tiene (look-aheads) está disponible solo en el sabor de expresión regular PCRE, que solo se admite en GNUgrepcon su-Pbandera.Suponiendo que necesita extraer solo la cadena coincidente después
prefixde agregar un indicador adicional-opara sabergrepque imprime solo la parte correspondiente comoTambién hay una versión
grepque admite bibliotecas PCRE de forma predeterminada,pcregrepen la que simplemente puede hacerLa explicación detallada de varios sabores de expresiones regulares se explica en la maravillosa respuesta de Giles y las herramientas que implementan cada uno de ellos.
fuente
Las expresiones regulares vienen en muchos sabores diferentes. Lo que está mostrando es una expresión regular similar a Perl (PCRE, "Expresión regular compatible con Perl").
grephace POSIX expresiones regulares. Estas son expresiones regulares básicas (BRE) y expresiones regulares extendidas (ERE, sigrepse usa con la-Eopción). Consulte el manualre_formato elregexo lo que sea semejante manual delgrepmanual se refiere a en su sistema, o los textos estándar POSIX que acabo de dichos enlaces.Si usa GNU
grep, podría usar expresiones regulares similares a Perl si usaragrepla opcióngrepespecífica de GNU-P.También tenga en cuenta que
grepdevuelve líneas por defecto, no subcadenas de líneas. Nuevamente, con GNUgrep(y algunas otrasgrepimplementaciones), puede usar la-oopción para obtener solo los bits que coinciden con la expresión dada de cada línea.Tenga en cuenta que ambas
-Py-ono son extensiones estándar de la especificación POSIXgrep.Si no está utilizando GNU
grep, puede utilizarlosedpara obtener el bit entre la cadenaprefixy el final de la línea:Lo que esto hace es imprimir solo las líneas que
sedlogran aplicar la sustitución dada. La sustitución reemplazará toda la línea que coincide con la expresión (que es un BRE), con el fragmento que aparece después de la cadenaprefix.Tenga en cuenta que si hay varias instancias
prefixen una línea, lasedvariación devolvería la cadena después de la última , mientras que lagrepvariación GNU devolvería la cadena después de la primera (que incluiría las otras instancias deprefix).La
sedsolución sería portátil para todos los sistemas tipo Unix.fuente
Como han dicho las otras respuestas,
grepno utiliza un sabor regex con lookbehinds (por defecto con GNUgrep, o no con otras versiones).Si no puede usar GNU
grepopcregrep, puede usarloperlsi lo tiene.La línea de comando equivalente con
perlsería:Pones la expresión regular deseada entre las barras. Como está usando Perl, esto usa el sabor de expresión regular de Perl .
fuente
print "$&\n" if ...si quieren emitir solo la parte posterior a laprefix