как извлечь часть имени файла перед «.» или перед расширением

как извлечь часть имени файла перед «.» или перед расширением

У меня есть файлы в формате ниже:

abc_asdfjhdsf_dfksfj_12345678.csv
hjjhk_hkjh_asd_asd_sd_98765498.csv
hgh_nn_25342134.exe

Я хочу получить значение до .и после последнего _.

Результат будет выглядеть так:

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

решение1

Вы также можете использовать awk,

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

Он устанавливает разделитель полей как _или .. Затем печать столбца номер 4 даст вам желаемый результат (вы также можете предпочесть $(NF-1)(поле but-last) вместо $4).

решение2

Если имя файла указано в переменной оболочки POSIX:

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

Пояснение:

  • ${variable%pattern}это как $variable, минуссамый короткийсоответствующий шаблон избэк-энд;
  • ${variable##pattern}это как $variable, за вычетомсамый длинныйсоответствующий шаблон извнешний интерфейс.

Видетьссылка вроде этойдля получения более подробной информации о расширении параметров.

Если список имен файлов находится в текстовом потоке, по одному имени файла на строку:

sed -n 's/.*_\(.*\)\..*/\1/p'

решение3

Вы можете использовать GNU grep:

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

Объяснение

  • (?<=)является ретроспективным поиском, (?<=_)соответствует подчеркиванию _перед шаблоном.
  • \d+соответствует одному или нескольким числам.
  • (?=)просмотр вперед, (?=\.)соответствует точке .после шаблона.

Полное регулярное выражение означает соответствие всем вещам между _и.

решение4

то же самое можно получить с помощью awk

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

из вашего примера

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

Связанный контент