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
grep
comprenderla. Porque por defectogrep
soporta BRE y con-E
flag lo hace ERE. Lo que tiene (look-aheads) está disponible solo en el sabor de expresión regular PCRE, que solo se admite en GNUgrep
con su-P
bandera.Suponiendo que necesita extraer solo la cadena coincidente después
prefix
de agregar un indicador adicional-o
para sabergrep
que imprime solo la parte correspondiente comoTambién hay una versión
grep
que admite bibliotecas PCRE de forma predeterminada,pcregrep
en 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").
grep
hace POSIX expresiones regulares. Estas son expresiones regulares básicas (BRE) y expresiones regulares extendidas (ERE, sigrep
se usa con la-E
opción). Consulte el manualre_format
o elregex
o lo que sea semejante manual delgrep
manual 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 usaragrep
la opcióngrep
específica de GNU-P
.También tenga en cuenta que
grep
devuelve líneas por defecto, no subcadenas de líneas. Nuevamente, con GNUgrep
(y algunas otrasgrep
implementaciones), puede usar la-o
opción para obtener solo los bits que coinciden con la expresión dada de cada línea.Tenga en cuenta que ambas
-P
y-o
no son extensiones estándar de la especificación POSIXgrep
.Si no está utilizando GNU
grep
, puede utilizarlosed
para obtener el bit entre la cadenaprefix
y el final de la línea:Lo que esto hace es imprimir solo las líneas que
sed
logran 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
prefix
en una línea, lased
variación devolvería la cadena después de la última , mientras que lagrep
variación GNU devolvería la cadena después de la primera (que incluiría las otras instancias deprefix
).La
sed
solución sería portátil para todos los sistemas tipo Unix.fuente
Como han dicho las otras respuestas,
grep
no utiliza un sabor regex con lookbehinds (por defecto con GNUgrep
, o no con otras versiones).Si no puede usar GNU
grep
opcregrep
, puede usarloperl
si lo tiene.La línea de comando equivalente con
perl
serí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