eliminar texto después de una expresión regular hasta el final de la línea

eliminar texto después de una expresión regular hasta el final de la línea

tengo un archivo como este

this is a year (2004); this text is not insteresting
singer elton john; month and year (December, 2005); blah blah
this another year (2007); irrelevant text

Quiero cortar la línea justo después del año);

this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

esto no está funcionando

sed -E 's/\(.*\)[0-9]{4});\(.*\)/\2/' file

¿Cómo podría hacerlo con sed o awk?

Respuesta1

Una forma válida de escribir lo que quieres es

sed -E 's/(.*[0-9]{4}\);).*/\1/' file

Esto eliminará todos los caracteres de línea después de la última aparición de yyyy);cada línea.

Tu intento fue

sed -E 's/\(.*\)[0-9]{4});\(.*\)/\2/' file

Pero debido a la -Ebandera que habilita expresiones regulares extendidas, \( \)no delimite los grupos coincidentes, sino que coincidan con los paréntesis literales del archivo, mientras ( )delimitan los grupos coincidentes. Entonces el paréntesis [0-9]{4})no coincide y sed se queja:

sed: -e expression #1, char 28: Unmatched ) or \)

Respuesta2

Si siempre hay uno solo );, es bastante sencillo:

$ sed 's/);.*/);/' file 
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

Si puede haber más y quieres eliminar todo después del último:

$ sed -E 's/(.*)\);.*/\1);/' file 
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

El tuyo no funciona porque estás intentando hacer coincidir un )seguido de 4 números ( \)[0-9]{4}) pero no lo tienes en tu entrada. Creo que estabas intentando escribir algo como esto:

$ sed -E 's/(.*[0-9]{4}\);).*/\1/' file
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

Respuesta3

Con grep(asumiendo que la versión que tienes admite -ola opción)

$ grep -oE '.*[0-9]{4});' file
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

-oEsta opción hará que grepse impriman solo las partes coincidentes. Por lo tanto, esto no es exactamente lo mismo que sedel comando, ya que las líneas que no contengan este patrón no se imprimirán.

Respuesta4

En su ejemplo, corta cada línea después de la última ;. Esta es una operación simple sedque no requiere ninguna referencia retrospectiva:

$ sed 's/;[^;]*$/;/' file
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

O con awk:

awk -F ';' 'BEGIN { OFS=FS } { $NF=""; print }' file

información relacionada