Используйте grep, чтобы сопоставить шаблон в строке только один раз - PullRequest
8 голосов
/ 03 марта 2012

У меня есть это:

 echo 12345 | grep -o '[[:digit:]]\{1,4\}'

Что дает это:

1234
5

Я понимаю, что происходит. Как я могу остановить попытки grep продолжить поиск после 1 успешного матча?

Как мне получить только

1234

Ответы [ 5 ]

8 голосов
/ 03 марта 2012

Хотите, чтобы grep прекратил сопоставление, или вас интересует только первое совпадение?Вы можете использовать head, если последнее верно ...

`grep stuff | head -n 1` 

Grep - это утилита на основе строки, поэтому флаг -m 1 указывает grep остановиться после того, как он совпадет с первым строка , что в сочетании с головой довольно хорошо на практике.

5 голосов
/ 03 мая 2013

Вам необходимо выполнить группировку: \(...\), за которой следует точное число вхождений: \{<n>\}, чтобы выполнить работу:

maci:~ san$ echo 12345 | grep -o '\([[:digit:]]\)\{4\}'
1234

Надеюсь, это поможет. Ура !!

3 голосов
/ 03 марта 2012

Используйте sed вместо grep:

echo 12345 | sed -n '/^\([0-9]\{1,4\}\).*/s//\1/p'

Это соответствует 4 цифрам в начале строки, за которыми следует что-либо, сохраняются только цифры и печатаются их. -n не позволяет печатать строки в противном случае. Если цифровая строка также может отображаться в средней строке, вам нужна более сложная команда.

На самом деле, в идеале вы должны использовать sed с регулярными выражениями PCRE, поскольку вам действительно нужно не жадное совпадение. Однако, до разумного приближения, вы можете использовать: ( Полу-решение значительно более сложной проблемы ... теперь удалено! )

Поскольку вы хотите, чтобы первая строка длиной до 4 цифр в строке, просто используйте sed, чтобы удалить все нецифровые символы, а затем напечатайте строку цифр:

echo abc12345 | sed -n '/^[^0-9]*\([0-9]\{1,4\}\).*/s//\1/p'

Соответствует строке из нецифровых чисел, за которыми следуют 1-4 цифры, за которыми следует что-либо, сохраняются только цифры и печатаются их.

0 голосов
/ 15 декабря 2018

На этой странице руководства grep говорится (см. Главу «Регулярные выражения»):

 (…)

 {n,}

      The preceding item is matched n or more times. 

 {n,m}     

      The preceding item is matched at least n times, but not more than m times. 

 (…)

Так что ответ должен быть:

 echo 12345 | grep -o '[[:digit:]]\{4\}'

Я только что проверил его на терминале Cygwin (2018), и он заработал!

0 голосов
/ 13 ноября 2017

Если - как в вашем примере - ваше числовое выражение появится в начале строки, с которой вы начинаете, вы можете просто добавить якорь начала строки ^:

echo 12345 | grep -o '^\([[:digit:]]\)\{1,4\}'

В зависимости от того, какие именно цифры вам нужны, может также помочь привязка конца строки $.

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