escanear y grepping

escanear y grepping

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 grepla 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 sesy 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 seden 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 sedcomando se puede describir de la siguiente manera

  1. -nno imprima nada a menos que se haga una coincidencia
  2. /rea ses/solo considere líneas que coincidan con este RE
  3. s!...!...!psustituya 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
  4. ^.*/\(.*\)\.[^.]*$Los partidos RE

    • Todo hasta el último corte./
    • Todo desde ahí hasta el último punto .(recordado como patrón \1)
    • Todo lo demas
  5. 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 basenamepara 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)

información relacionada