Почему мое условие повторения с диапазоном grep не работающий?

Разыскиваемый решение на Так, Спросите и Unix/Linux, но я потерян, пытаясь выяснить, как записать условное выражение с диапазоном grep:

Пройдите:

1-20_something
100-200_something
2-100_something
11-333_something

кодируйте работы, но только на 1-9_something:

if grep -q '[0-9]-[0-9]_something' "$foobar"; then
    echo "Additional Code"
fi

не работает:

if grep -q '\d{1,3}-\d{1,3}_something' "$foobar"; then
    echo "Additional Code"
fi

и это не работает:

if grep -q '[0-9]{1,3}-[0-9]{1,3}_something' "$foobar"; then
    echo "Additional Code"
fi

Что лучший способ состоит в том, чтобы расположиться через {1,3}?

Править:

Для помощи следующему человеку, который может натыкаться на это, я сделал большой поиск и после ответов, учитывая, я смог закончиться:

2
задан 23 May 2017 в 15:39

2 ответа

Фигурные скобки { } рассматривают как литералы в BRE (Основное Регулярное выражение). От man grep:

   Basic vs Extended Regular Expressions
       In  basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their
       special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).

, Таким образом, Вы нуждаетесь или

grep '[0-9]\{1,3\}-[0-9]\{1,3\}_something'

или включаете режим Extended Regular Expression с -E переключатель

grep -E '[0-9]{1,3}-[0-9]{1,3}_something'
3
ответ дан 2 December 2019 в 01:58

Ваша вторая попытка должна работать при включении PCRE (Совместимые с Perl регулярные выражения) использование -P:

grep -Pq '\d{1,3}-\d{1,3}_something'

\d не находится в BRE или ДО или в списке дополнительные выражения обратной косой черты , что GNU, который Grep имеет, но это - вещь Perl.

Ваша третья попытка должна работать, если бы Вы включили ДО (расширенные регулярные выражения) :

grep -Eq '[0-9]{1,3}-[0-9]{1,3}_something'

<exp>{m,n} не BRE (основное регулярное выражение) конструкция.

2
ответ дан 2 December 2019 в 01:58

Другие вопросы по тегам:

Похожие вопросы: