
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