
У меня есть файлы в формате ниже:
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