Ответ 1
это нормально?
sed -r 's/.*_([0-9]*)\..*/\1/g'
с вашим примером:
kent$ echo "./pentaray_run2/Trace_220560.dat"|sed -r 's/.*_([0-9]*)\..*/\1/g'
220560
Еще один вопрос для опытных экспертов.
У меня есть строка, представляющая путь, в котором будут два числа. Пример:
./pentaray_run2/Trace_220560.dat
Мне нужно извлечь второе из этих чисел - т.е. 220560
У меня (с некоторой помощью с форумов) удалось собрать все числа вместе (например, 2220560) с помощью
sed "s/[^0-9]//g"
или извлечь только первое число с помощью:
sed -r 's|^([^.]+).*$|\1|; s|^[^0-9]*([0-9]+).*$|\1|'
Но то, что мне нужно, - это второе число! Любая помощь очень ценится.
PS номер, который я за ним, всегда является вторым номером в строке.
это нормально?
sed -r 's/.*_([0-9]*)\..*/\1/g'
с вашим примером:
kent$ echo "./pentaray_run2/Trace_220560.dat"|sed -r 's/.*_([0-9]*)\..*/\1/g'
220560
Если grep
приветствуется:
$ echo './pentaray_run2/Trace_220560.dat' | grep -oP '\d+\D+\K\d+'
220560
И более портативный с Perl
с тем же регулярным выражением:
echo './pentaray_run2/Trace_220560.dat' | perl -lne 'print $& if /\d+\D+\K\d+/'
220560
Я думаю, что подход более чист и более устойчив, чем при использовании sed
Вы можете извлечь последние цифры с помощью этого:
sed -e 's/.*[^0-9]\([0-9]\+\)[^0-9]*$/\1/'
Легче думать об этом назад:
Часть 3 матча - это то, где происходит "волшебство", но оно также ограничивает ваши совпадения, чтобы иметь хотя бы не цифру перед номером (т.е. вы не можете сопоставить строку с одним числом, которое находится в начало строки, хотя существует простой способ вставки нецифровой строки в начало строки).
Магия - противодействовать легальной жадности .*
(часть 4). Без части 3 часть 4 будет потреблять все, что она может, включая номера, но вместе с ним сопоставление гарантирует, что она останавливается, чтобы разрешить по крайней мере не цифру, за которой следует цифра, потребляемая частями 1 и 2, позволяя записывать номер.
Это может сработать для вас (GNU sed):
sed -r 's/([^0-9]*([0-9]*)){2}.*/\2/' file
Это извлекает второе число:
sed -r 's/([^0-9]*([0-9]*)){1}.*/\2/' file
и это извлекает первый.