Соответствие точному количеству цифр в строке

Дистрибутив на основе Ubuntu для кластеров Beowulf, разработанный Университетом Страны Басков в Испании: http://www.ehu.eus/AC/ABC.htm

На основе дистрибутива ABC GNU / Linux на Ubuntu и специализируется на автоматическом создании высокопроизводительных кластеров Beowulf с загрузкой только в "живом" режиме во внешнем интерфейсе или при установке на ваш жесткий диск. Бездисковые узлы прорываются через PXE. Использовать в качестве оконного менеджера Gnome. Integra Resource Monitor Ganglia. Это первый дистрибутив, который объединяет все эти функции. Была опубликована научная статья об этой системе и представлена ​​на симпозиуме IEEE ICAT2009, который проходил в Сараево (Босния и Герцеговина). Разработано Икером Кастаньосом, Изаскун Гарридо Гарридо и группой автоматического управления Aitor Университета Страны Басков UPV / EHU .

Перевод из статьи в Википедии на испанском .

1
10.11.2018, 04:30
3 ответа

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

grep -Eq '[0-9]{7}' <<< "1505082"

grep соответствует 7 цифрам. Вы можете увидеть, что сопоставляется, заменив q наo:

$ grep -Eo '[0-9]{7}' <<< "1505082"; echo "$?"
1505082
0

И да, это тоже будет соответствовать этому:

$ grep -Eq '[0-9]{7}' <<< "150508299999"; echo "$?"
1505082
0

Он убрал все девятки.
Проблема в том, что вы делаете не привязанное соответствие -, и оно будет соответствовать 7-значному(или более)числу.

Вы можете закрепить с помощью:

$ grep -Eq '^[0-9]{7}$' <<< "15050829999"; echo "$?"
1

Чтобы сопоставить 7-значное число в любом месте , за которым или перед которым стоят не -цифры, вам нужен совершенно другой якорь:

$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082"; echo $?
1505082
0

$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082_CSE_322"; echo $?
1505082
0

$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082999_CSE_322"; echo $?
0

Это просмотр вперед, один просмотр -назад:

(?<=^|[^0-9])

Это соответствует либо началу строки (^), либо цифре, отличной от -. Другой — прогноз:

(?=[^0-9]|$)

, которые соответствуют цифре, отличной от -, или концу строки.


Единственная другая альтернатива более простому Extendedрегулярному выражению – извлечь любую серию из7(или более )цифр, а затем подтвердить, что это ровно 7 цифр:

$ echo "150508299_CSE_322" | 
          grep -oE '[0-9]{7,}' | 
                  grep -qE '^[0-9]{7}$'; echo "$?"
1
2
27.01.2020, 23:31

Когда с grepвозникают сложности, вы всегда можете использовать egrepили даже язык программирования, доступный в системе linux/unix, чтобы помочь вам с вашими совпадениями/регулярными выражениями.

Если в вашей системе есть perl или ruby, вы можете сделать это в одну строку:

echo 1234567| ruby -lne 'print if /^\d{7}$/'

echo 1234567| perl -lne 'print if /^\d{7}$/'

или

cat file.txt | ruby -lne 'print if /^\d{7}$/'

0
27.01.2020, 23:31

Почему бы не использовать бинарный оператор Bash =~?

$ [[ 1505082 =~ [0-9]{7} ]] && echo matched
matched

Подробнее см.:http://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Conditional-Constructs

0
22.04.2020, 14:53

Теги

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