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
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
).
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'
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 .
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 `_`
_
: "${n%_*}_"
n
: ${n#value}
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
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