
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ê grep
suportar 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 ses
e 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 sed
em 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 sed
comando faz pode ser descrito da seguinte forma
-n
não imprima nada a menos que uma correspondência seja feita/rea ses/
considere apenas linhas que correspondam a este REs!...!...!p
substitua o RE entre os dois primeiros pontos de exclamação (!
) pela string a seguir, mas imprima a linha apenas se ocorrer uma correspondênciaAs
^.*/\(.*\)\.[^.]*$
partidas de RE- Tudo até a última barra
/
- Tudo de lá até o último ponto
.
(lembrado como padrão\1
) - Todo o resto
- Tudo até a última barra
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 basename
para 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)