
Tengo un archivo ( *.ses
) que contiene la siguiente línea
$ rea ses '../../../../abcdefgh/abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001.ses'
Cuando uso este comando:
cat a4.ses | grep -im1 'rea ses' | awk -F'[/]' '{print $NF}'
la salida es:
abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001.ses'
Solo quiero que el resultado sea:
abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001
sin la extensión.
¿Cómo puedo hacer eso?
Respuesta1
Si .ses'
es una extensión estática, simplemente codifique la eliminación de los 5 caracteres finales en awk imprimiendo la cadena desde el principio hasta los 5 del final:
awk -F/ '{print substr($NF, 1, length($NF)-5)}'
Si la longitud de la extensión puede variar, reemplácela con la cadena vacía antes de imprimirla:
awk -F/ '{gsub(/\..+$/, "", $NF); print $NF}'
Respuesta2
Si admite grep
la sintaxis de expresiones regulares compatibles con Perl (PCRE):
$ grep -Po 'rea ses.*/\K[^.]*' file
abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001
Explicación:
- combinar
rea ses
y luego con avidez todo hasta/
inclusivo; entonces - coincidir con la secuencia más larga de caracteres sin punto
- descartar (
\K
) la parte izquierda y generar solo lo que queda de la coincidencia (-o
)
Respuesta3
Puedes prescindir de esa tubería y usar sed
en su lugar
sed -n '/rea ses/s!^.*/\(.*\)\.[^.]*$!\1!p' a4.ses
Producción
abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001
Lo que hace ese sed
comando se puede describir de la siguiente manera
-n
no imprima nada a menos que se haga una coincidencia/rea ses/
solo considere líneas que coincidan con este REs!...!...!p
sustituya el RE dentro de los dos primeros signos de exclamación (!
) por la siguiente cadena, pero solo imprima la línea si ocurre una coincidencia^.*/\(.*\)\.[^.]*$
Los partidos RE- Todo hasta el último corte.
/
- Todo desde ahí hasta el último punto
.
(recordado como patrón\1
) - Todo lo demas
- Todo hasta el último corte.
La sustitución del patrón descrito en el punto 4 se realiza con patrón
\1
, es decir, su nombre de archivo sin la extensión de puntos al final.
Respuesta4
Puede utilizar basename
para eliminar una extensión final:
cat a4.ses | grep -im1 'rea ses' | awk -F'[/]' '{print $NF}' | xargs basename -s .ses\'
(enviado para que esté completo, dado su proceso, la respuesta de @steeldriver es mejor)