digitalização e grep

digitalização e grep

Eu tenho um arquivo ( *.ses) que contém a seguinte linha

$   rea ses '../../../../abcdefgh/abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001.ses'

Quando eu uso este comando:

cat a4.ses | grep -im1 'rea ses' | awk -F'[/]' '{print $NF}'

a saída é:

abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001.ses'

Eu só quero que a saída seja:

abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001

sem a extensão.

Como eu posso fazer isso?

Responder1

Se .ses'for uma extensão estática, simplesmente codifique a remoção dos 5 caracteres finais no awk, imprimindo a string do início até 5 do final:

awk -F/ '{print substr($NF, 1, length($NF)-5)}'

Se o comprimento da extensão puder variar, substitua-a pela string vazia antes de imprimi-la:

awk -F/ '{gsub(/\..+$/, "", $NF); print $NF}'

Responder2

Se você grepsuportar a sintaxe de expressão regular compatível com Perl (PCRE):

$ grep -Po 'rea ses.*/\K[^.]*' file
abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001

Explicação:

  • combinar rea sese depois avidamente tudo até /inclusivo; então
  • corresponde à sequência mais longa de caracteres sem ponto final
  • descarte ( \K) a parte esquerda e produza apenas o que resta da partida ( -o)

Responder3

Você pode dispensar esse pipeline e usar sedem seu lugar

sed -n '/rea ses/s!^.*/\(.*\)\.[^.]*$!\1!p' a4.ses

Saída

abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001

O que esse sedcomando faz pode ser descrito da seguinte forma

  1. -nnão imprima nada a menos que uma correspondência seja feita
  2. /rea ses/considere apenas linhas que correspondam a este RE
  3. s!...!...!psubstitua o RE entre os dois primeiros pontos de exclamação ( !) pela string a seguir, mas imprima a linha apenas se ocorrer uma correspondência
  4. As ^.*/\(.*\)\.[^.]*$partidas de RE

    • Tudo até a última barra/
    • Tudo de lá até o último ponto .(lembrado como padrão \1)
    • Todo o resto
  5. A substituição do padrão descrito no item 4 é feita por padrão \1, ou seja, seu nome de arquivo sem a extensão pontilhada à direita

Responder4

Você pode usar basenamepara remover uma extensão final:

cat a4.ses | grep -im1 'rea ses' | awk -F'[/]' '{print $NF}' | xargs basename -s .ses\' 

(enviado para completar, dado o seu processo, a resposta do @steeldriver é melhor)

informação relacionada