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 -E
bandera 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 -o
la 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);
-o
Esta opción hará que grep
se impriman solo las partes coincidentes. Por lo tanto, esto no es exactamente lo mismo que sed
el 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 sed
que 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