Tengo archivos en el siguiente formato:
abc_asdfjhdsf_dfksfj_12345678.csv
hjjhk_hkjh_asd_asd_sd_98765498.csv
hgh_nn_25342134.exe
Quiero obtener el valor antes .
y después del último _
.
El resultado sería así:
abc_asdfjhdsf_dfksfj_12345678.csv ----> 12345678
hjjhk_hkjh_asd_asd_sd_98765498.csv ----> 98765498
hgh_nn_25342134.exe ----> 25342134
Respuesta1
También podrías usar awk,
$ echo "abc_asdfjhdsf_dfksfj_12345678.csv" | awk -F'[_.]' '{print $4}'
12345678
Establece el separador de campo como _
o .
. Luego, imprimir la columna número 4 le dará el resultado deseado (es posible que también prefiera $(NF-1)
(el último campo) en lugar de $4
).
Respuesta2
Si tiene el nombre del archivo en una variable de shell POSIX:
file=abc_asdfjhdsf_dfksfj_12345678.csv
n=${file%.*} # n becomes abc_asdfjhdsf_dfksfj_12345678
n=${file##*_} # n becomes 12345678.csv
Por explicación:
${variable%pattern}
es como$variable
, menosmás cortopatrón coincidente de laback-end;${variable##pattern}
es como$variable
, menos elmás largopatrón coincidente deInterfaz.
Veruna referencia como estapara obtener más información sobre la expansión de parámetros.
Si la lista de nombres de archivos está en una secuencia de texto con un nombre de archivo por línea:
sed -n 's/.*_\(.*\)\..*/\1/p'
Respuesta3
Puedes usar GNU grep
:
$ echo abc_asdfjhdsf_dfksfj_12345678.csv | grep -oP '(?<=_)\d+(?=\.)'
12345678
Explicación
(?<=)
mira hacia atrás y(?<=_)
coincide con un guión bajo_
antes del patrón.\d+
coincide con uno o más números.(?=)
es una anticipación,(?=\.)
coincide con un punto.
después del patrón.
Toda la expresión regular significa hacer coincidir todas las cosas entre _
y.
Respuesta4
puedes obtener lo mismo usando awk
awk -F"." '{print $1}' | awk -F"_" '{print $NF}'
de tu ejemplo
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