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

6

Eu tenho arquivos em formato abaixo:

abc_asdfjhdsf_dfksfj_12345678.csv
hjjhk_hkjh_asd_asd_sd_98765498.csv
hgh_nn_25342134.exe

Eu quero obter o valor antes do . 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
    
por shah 18.06.2014 / 10:59

6 respostas

12

Você também pode usar o awk,

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

Define o separador de campo como _ ou . . Em seguida, imprimir o número da coluna 4 fornecerá o resultado desejado (você também pode preferir $(NF-1) (o último campo) em vez de $4 ).

    
por 18.06.2014 / 11:11
10

Se você tiver o nome do arquivo em uma variável de 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 , menos menor padrão de correspondência do back-end ;
  • ${variable##pattern} é como $variable , menos o padrão de correspondência maior de front-end .

Veja uma referência como esta para mais informações 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/.*_\(.*\)\..*//p'
    
por 18.06.2014 / 12:00
3

Você pode usar o 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.
  • (?=) é lookahead, (?=\.) corresponde a um ponto . após o padrão.

A regex inteira significa corresponder todas as coisas entre _ e .

    
por 18.06.2014 / 11:03
1

Como o sublinhado para selecionar é o último:

Usando uma variável para conter o nome do arquivo:

file=abc_asdfjhdsf_dfksfj_12345678.csv
n=${file%.*}          # remove the extension '.csv'
n=${n#"${n%_*}_"}     # remove up to the last underscore '_'
  1. Primeiro, remova a extensão (após o último ponto)
  2. crie um valor que remova do último _ : "${n%_*}_"
  3. remova o valor de 2 da frente de n : ${n#value}
por 06.02.2018 / 21:46
0

Simplesmente:

a=hjjhk_hkjh_asd_asd_sd_98765498.csv
pos1=${a%_*}
pos2=${a%.*}
echo ${a:${#pos1}+1:${#pos2}-${#pos1}-1}

obtenha o deslocamento do último _ para pos1 obter o deslocamento do último. para pos2 substring from _ offset para. offset

    
por 18.06.2014 / 13:20
0

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
    
por 19.06.2014 / 18:14