Dado que necesita hacer coincidir el contenido sin incluirlo en el resultado (debe coincidir, name="
pero no es parte del resultado deseado) se requiere alguna forma de coincidencia de ancho cero o captura de grupo. Esto se puede hacer fácilmente con las siguientes herramientas:
Perl
Con Perl, puede usar la n
opción para recorrer línea por línea e imprimir el contenido de un grupo de captura si coincide:
perl -ne 'print "$1\n" if /name="(.*?)"/' filename
GNU grep
Si tiene una versión mejorada de grep, como GNU grep, puede tener la -P
opción disponible. Esta opción habilitará una expresión regular similar a Perl, lo que le permitirá usar \K
una búsqueda retrospectiva abreviada. Restablecerá la posición de coincidencia, por lo que cualquier cosa antes de que sea de ancho cero.
grep -Po 'name="\K.*?(?=")' filename
La o
opción hace que grep imprima solo el texto coincidente, en lugar de la línea completa.
Vim - Editor de texto
Otra forma es utilizar un editor de texto directamente. Con Vim, una de las diversas formas de lograr esto sería eliminar las líneas sin
name=
y luego extraer el contenido de las líneas resultantes:
:v/.*name="\v([^"]+).*/d|%s//\1
Grep estándar
Si no tiene acceso a estas herramientas, por alguna razón, se podría lograr algo similar con grep estándar. Sin embargo, sin mirar alrededor, será necesario limpiarlo más tarde:
grep -o 'name="[^"]*"' filename
Una nota sobre cómo guardar resultados
En todos los comandos anteriores, se enviarán los resultados a stdout
. Es importante recordar que siempre puede guardarlos conectándolos a un archivo agregando:
> result
hasta el final del comando.