Почему этот `grep -o` терпит неудачу, и как я должен обойти это? - PullRequest
9 голосов
/ 15 ноября 2009

С учетом ввода

echo abc123def | grep -o '[0-9]*'

На одном компьютере (с GNU grep 2.5.4) возвращается 123, а на другом (с GNU grep 2.5.1) возвращается пустая строка. Есть ли какое-то объяснение, почему grep 2.5.1 не работает здесь, или это просто ошибка? Я использую grep -o таким образом в скрипте bash, который я бы хотел запускать на разных компьютерах (которые могут иметь разные версии grep). Есть ли «правильный способ» получить последовательное поведение?

Ответы [ 5 ]

9 голосов
/ 15 ноября 2009

Да, обработка 2.5.1 -o была глючной: http://www.mail-archive.com/bug-grep@gnu.org/msg00993.html

Grep, вероятно, не подходит для этого; sed или tr или даже perl могут быть лучше в зависимости от того, что является реальной задачей.

2 голосов
/ 06 мая 2011

У меня была такая же проблема, и я обнаружил, что на этой машине было установлено egrep. Быстрое решение было использовать

 echo abc123def | egrep -o '[0-9]*'
2 голосов
/ 15 ноября 2009

вы можете использовать оболочку. быстрее

$ str=abc123def
$ echo ${str//[a-z]/}
123
0 голосов
/ 28 июля 2012

Поскольку вы используете регулярное выражение, вы должны использовать либо:

  1. grep -E
  2. egrep (как написал Себастьян).

Удачи!

0 голосов
/ 15 ноября 2009

Это даст аналогичные результаты:

echo abc123def | sed -n 's/[^0-9]*\([0-9]\+\).*/\1/p'

Ваш вопрос почти дубликат этого .

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