sed извлекает группу цифр - PullRequest
15 голосов
/ 13 февраля 2012

Я пытался извлечь число, указанное ниже, но на экране ничего не печаталось:

echo "This is an example: 65 apples" | sed -n  's/.*\([0-9]*\) apples/\1/p'

Однако я получаю '65', если обе цифры сопоставляются отдельно, как указано ниже:

echo "This is an example: 65 apples" | sed -n  's/.*\([0-9][0-9]\) apples/\1/p'
65

Как я могу сопоставить число так, что я не знаю количество цифр в числе, которое нужно извлечь, например, это может быть 2344 вместо 65?

Ответы [ 5 ]

19 голосов
/ 13 февраля 2012
$ echo "This is an example: 65 apples" | sed -r  's/^[^0-9]*([0-9]+).*/\1/'
65
5 голосов
/ 13 февраля 2012

Это потому, что ваш первый .* является жадным , а ваш [0-9]* допускает 0 или более цифр. Следовательно, .* поглощает столько, сколько может (включая цифры), а [0-9]* ничего не соответствует.

Вы можете сделать:

echo "This is an example: 65 apples" | sed -n  's/.*\b\([0-9]\+\) apples/\1/p'

, где я вынудил [0-9] сопоставить хотя бы одну цифру, а также добавил границу слова перед цифрами, чтобы сопоставить все число.

Однако проще использовать grep, где вы соответствуете только числу:

echo "This is an example: 65 apples" | grep -P -o '[0-9]+(?= +apples)'

-P означает «регулярное выражение perl» (поэтому мне не нужно беспокоиться о экранировании от «+»).

-o означает «печатать только спички».

(?= +apples) означает совпадение цифр, за которыми следует слово яблоки.

2 голосов
/ 15 апреля 2016

Простой способ извлечь все числа из строки

echo "1213 test 456 test 789" | grep -P -o "\d+"

И результат:

1213
456
789
2 голосов
/ 13 февраля 2012

То, что вы видите, - это жадное поведение регулярных выражений. В вашем первом примере .* сожирает все цифры. Нечто подобное делает это:

echo "This is an example: 65144 apples" | sed -n  's/[^0-9]*\([0-9]\+\) apples/\1/p'
65144

Таким образом, вы не можете сопоставить никакие цифры в первом бите. У некоторых диалектов регулярных выражений есть способ попросить не жадного соответствия, но я не верю, что у sed есть один.

0 голосов
/ 13 февраля 2012
echo "This is an example: 65 apples" | ssed -nR -e 's/.*?\b([0-9]*) apples/\1/p'

Однако для этого вам понадобится super-sed. -R разрешает регулярное выражение perl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...