digitalização e grepping

0

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 posso fazer isso?

    
por Jeff Schaller 20.11.2017 / 15:44

4 respostas

2

Se .ses' for uma extensão estática, simplesmente codifique com firmeza a remoção desses caracteres no awk, imprimindo a cadeia desde o início até o final do 5:

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

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

awk -F/ '{gsub(/\..+$/, "", $NF); print $NF}'
    
por 20.11.2017 / 15:53
2

Se o seu grep suporta a sintaxe da expressão regular compatível com o perl (PCRE):

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

Explicação:

  • corresponde rea ses e depois avidamente tudo até / inclusive; então
  • corresponde à sequência mais longa de caracteres não periódicos
  • descarta ( \K ) a parte esquerda e gera apenas o que resta da correspondência ( -o )
por 20.11.2017 / 15:59
1

Você pode dispensar esse pipeline e usar sed

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

Saída

abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001

O que esse comando sed faz pode ser descrito da seguinte forma

  1. -n não imprime nada a menos que uma correspondência seja feita
  2. /rea ses/ considera apenas as linhas que correspondem a este RE
  3. s!...!...!p substitui o RE dentro dos dois primeiros pontos de exclamação ( ! ) para a seguinte string, mas imprima apenas a linha se ocorrer uma correspondência
  4. O RE ^.*/\(.*\)\.[^.]*$ corresponde

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

por 20.11.2017 / 15:53
0

Você pode usar basename para remover uma extensão final:

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

(enviado para conclusão, dado o seu processo, a resposta da @ steeldriver é melhor)

    
por 20.11.2017 / 16:15