цифры экстракта седа - PullRequest
       11

цифры экстракта седа

8 голосов
/ 12 сентября 2011

Я пытаюсь извлечь цифры с помощью sed:

echo hgdfjg678gfdg kjg45nn | sed 's/.*\([0-9]\+\).*/\1/g'

, но результат: 5 Как извлечь: 678 и 45?Заранее спасибо!

Ответы [ 4 ]

13 голосов
/ 12 сентября 2011

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

Вместо того, чтобы извлекать цифры, просто удалите не цифры:

echo hgdfjg678gfdg kjg45nn | sed 's/[^0-9]//g'

или даже

echo hgdfjg678gfdg kjg45nn | tr -d -c 0-9
6 голосов
/ 12 сентября 2011

Вы можете использовать grep с опцией -o для этого:

$ echo hgdfjg678gfdg kjg45nn | grep -E -o "[0-9]+"
678
45
3 голосов
/ 13 сентября 2011

Или используйте tr:

$ echo hgdfjg678gfdg kjg45nn | tr -d [a-z]
678 45
1 голос
/ 31 мая 2017

.* в sed является жадным.И нет опции non-greedy AFAIK.
(Вы должны использовать [^0-9]* в этом случае для сопоставления без жадности. Но это работает только один раз, поэтому вы получите только 678 без 45.)

Если вы должны использовать только sed, получить результат будет нелегко.
Я рекомендую использовать gnu's grep

$ echo hgdfjg678gfdg kjg45nn | grep -oP '\d+'
678
45

Если вы действительно хотите придерживатьсяна sed, это будет один из многих возможных ответов.

$ echo hgdfjg678gfdg kjg45nn | \
sed -e 's/\([0-9^]\)\([^0-9]\)/\1\n\2/g' | \
sed -n 's/[^0-9]*\([0-9]\+\).*/\1/p’
678
45
...