Подтвердить что ты не робот

Извлечь числа из строки с помощью sed и регулярных выражений

Еще один вопрос для опытных экспертов.

У меня есть строка, представляющая путь, в котором будут два числа. Пример:

./pentaray_run2/Trace_220560.dat

Мне нужно извлечь второе из этих чисел - т.е. 220560

У меня (с некоторой помощью с форумов) удалось собрать все числа вместе (например, 2220560) с помощью

sed "s/[^0-9]//g"

или извлечь только первое число с помощью:

sed -r 's|^([^.]+).*$|\1|; s|^[^0-9]*([0-9]+).*$|\1|'

Но то, что мне нужно, - это второе число! Любая помощь очень ценится.

PS номер, который я за ним, всегда является вторым номером в строке.

4b9b3361

Ответ 1

это нормально?

sed -r 's/.*_([0-9]*)\..*/\1/g'

с вашим примером:

kent$   echo "./pentaray_run2/Trace_220560.dat"|sed -r 's/.*_([0-9]*)\..*/\1/g'
220560

Ответ 2

Если 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

Ответ 3

Вы можете извлечь последние цифры с помощью этого:

sed -e 's/.*[^0-9]\([0-9]\+\)[^0-9]*$/\1/'

Легче думать об этом назад:

  • В конце строки сопоставляются ноль или более нецифровых символов
  • Сопоставление (и захват) одного или нескольких цифровых символов
  • Сопоставьте хотя бы один символ без цифр.
  • Сопоставьте все символы с началом строки

Часть 3 матча - это то, где происходит "волшебство", но оно также ограничивает ваши совпадения, чтобы иметь хотя бы не цифру перед номером (т.е. вы не можете сопоставить строку с одним числом, которое находится в начало строки, хотя существует простой способ вставки нецифровой строки в начало строки).

Магия - противодействовать легальной жадности .* (часть 4). Без части 3 часть 4 будет потреблять все, что она может, включая номера, но вместе с ним сопоставление гарантирует, что она останавливается, чтобы разрешить по крайней мере не цифру, за которой следует цифра, потребляемая частями 1 и 2, позволяя записывать номер.

Ответ 4

Это может сработать для вас (GNU sed):

sed -r 's/([^0-9]*([0-9]*)){2}.*/\2/' file

Это извлекает второе число:

sed -r 's/([^0-9]*([0-9]*)){1}.*/\2/' file

и это извлекает первый.