web-dev-qa-db-fra.com

Comment extraire une partie d'un nom de fichier avant '.' ' ou avant l'extension

J'ai des fichiers au format ci-dessous:

abc_asdfjhdsf_dfksfj_12345678.csv
hjjhk_hkjh_asd_asd_sd_98765498.csv
hgh_nn_25342134.exe

Je veux avoir la valeur avant le . et après le dernier _.

Le résultat ressemblerait à:

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

Vous pourriez utiliser awk aussi,

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

Il définit le séparateur de champ comme _ Ou .. Ensuite, imprimez le numéro de colonne 4 vous donnera le résultat souhaité (vous pouvez également préférer $(NF-1) (le champ mais le dernier champ) au lieu de $4).

13
Tingrammer

Si vous avez le nom de fichier dans une variable de coquille POSIX:

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

Par explication:

  • ${variable%pattern} est comme $variable, moins le plus court Motif de correspondance du Back-end;
  • ${variable##pattern} est comme $variable, moins le le plus long Motif de correspondance de front-end.

Voir ne référence comme celle-ci Pour plus d'informations sur l'expansion des paramètres.

Si la liste des noms de fichier est sur un flux de texte avec un nom de fichier par ligne:

sed -n 's/.*_\(.*\)\..*/\1/p'
10
Stéphane Chazelas

Vous pouvez utiliser GNU grep:

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

explication

  • (?<=) est lookbehind, (?<=_) correspond à un soulignement _ avant le motif.
  • \d+ correspond à un ou plusieurs chiffres.
  • (?=) est ogameaad, (?=\.) correspond à un point . après le motif.

Toute la regex signifie correspondre à toutes les choses entre _ et .

3
cuonglm

Depuis le soulignement pour sélectionner est le dernier:

Utilisation d'une variable pour contenir le nom du fichier:

file=abc_asdfjhdsf_dfksfj_12345678.csv
n=${file%.*}          # remove the extension `.csv`
n=${n#"${n%_*}_"}     # remove up to the last underscore `_`
  1. D'abord supprimer l'extension (après le dernier point)
  2. construire une valeur en suppression du dernier _: "${n%_*}_"
  3. supprimez la valeur de 2 du début de n: ${n#value}
1
Isaac

Simplement:

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

obtenez le décalage du dernier _ à POS1 obtenir le décalage de la dernière fois. à la sous-chaîne POS2 de _ compensé à. décalage

0
periket2000

vous pouvez obtenir la même chose avec awk

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

de votre exemple

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
0
upkar