cómo extraer parte de un nombre de archivo antes de '.' o antes de la extensión

cómo extraer parte de un nombre de archivo antes de '.' o antes de la extensión

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

información relacionada