como extrair parte de um nome de arquivo antes de '.' ou antes da extensão

como extrair parte de um nome de arquivo antes de '.' ou antes da extensão

Tenho arquivos no formato abaixo:

abc_asdfjhdsf_dfksfj_12345678.csv
hjjhk_hkjh_asd_asd_sd_98765498.csv
hgh_nn_25342134.exe

Quero obter o valor antes .e depois do último _.

O resultado seria parecido com:

abc_asdfjhdsf_dfksfj_12345678.csv   ----> 12345678
hjjhk_hkjh_asd_asd_sd_98765498.csv  ----> 98765498
hgh_nn_25342134.exe                 ----> 25342134

Responder1

Você também pode usar o awk,

$ echo "abc_asdfjhdsf_dfksfj_12345678.csv" | awk -F'[_.]' '{print $4}'
12345678

Ele define o separador de campos como _ou .. Em seguida, imprimir a coluna número 4 fornecerá o resultado desejado (você também pode preferir $(NF-1)(o último campo) em vez de $4).

Responder2

Se você tiver o nome do arquivo em uma variável shell POSIX:

file=abc_asdfjhdsf_dfksfj_12345678.csv
n=${file%.*}   # n becomes abc_asdfjhdsf_dfksfj_12345678
n=${file##*_}  # n becomes 12345678.csv

Por explicação:

  • ${variable%pattern}é como $variable, menosmais curtopadrão correspondente doProcesso interno;
  • ${variable##pattern}é como $variable, menos omais longopadrão correspondente defront-end.

Veruma referência como estapara saber mais sobre expansão de parâmetros.

Se a lista de nomes de arquivos estiver em um fluxo de texto com um nome de arquivo por linha:

sed -n 's/.*_\(.*\)\..*/\1/p'

Responder3

Você pode usar GNU grep:

$ echo abc_asdfjhdsf_dfksfj_12345678.csv | grep -oP '(?<=_)\d+(?=\.)'
12345678

Explicação

  • (?<=)é lookbehind, (?<=_)corresponde a um sublinhado _antes do padrão.
  • \d+corresponde a um ou mais números.
  • (?=)é antecipado, (?=\.)corresponde a um ponto .após o padrão.

Todo o regex significa combinar todas as coisas entre _e.

Responder4

você pode obter o mesmo usando o awk

awk -F"." '{print $1}' | awk -F"_" '{print $NF}'

do seu exemplo

echo "abc_asdfjhdsf_dfksfj_12345678.csv" | awk -F"." '{print $1}' | awk -F"_" '{print $NF}'
12345678

echo "hjjhk_hkjh_asd_asd_sd_98765498.csv" | awk -F"." '{print $1}' | awk -F"_" '{print $NF}'
98765498

echo "hgh_nn_25342134.exe" | awk -F"." '{print $1}' | awk -F"_" '{print $NF}'
25342134

informação relacionada