Con gawk
, puede utilizar la función de coincidencia:
x="hey there how are you"
echo "$x" |awk --re-interval '{match($0,/(.{4})how(.{4})/,a);print a[1],a[2]}'
ere are
Si estás bien con perl
, la solución más flexible: siguiente imprimirá tres caracteres antes de que el patrón seguido por patrón real y después de 5 caracteres según el modelo .
echo hey there how are you |perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/'
ey there how
Esto también se puede aplicar a palabras en vez de simplemente characters.Following imprimirá una palabra antes de que la cadena coincidente real.
echo hey there how are you |perl -lne 'print $1 if /(\w+) there/'
hey
siguiente imprimirá una palabra después de que el patrón:
echo hey there how are you |perl -lne 'print $2 if /(\w+) there (\w+)/'
how
siguiente imprimirá una palabra antes de que el patrón, entonces la palabra real y luego una palabra después de que el patrón:
echo hey there how are you |perl -lne 'print "$1$2$3" if /(\w+)(there)(\w+)/'
hey there how
Una buena respuesta para pequeñas cantidades de datos, pero comienza a ser lenta cuando se combinan> 100 caracteres, p. Ej. en mi archivo xml gigante, quiero {1,200} antes y después, y es demasiado lento para usar. – Benubird
La versión awk de @amit_g es mucho más rápida. – ssobczak
No está disponible en Mac OSX, así que realmente esta no es una solución ampliamente disponible. La versión -E (enumerada a continuación) es una mejor solución. ¿Qué es -P? Siga leyendo ... -P, --perl-regexp Interprete PATTERN como una expresión regular de Perl (PCRE, consulte a continuación). Esto es altamente experimental y grep -P puede advertir sobre las características no implementadas. – Xofo