Найдите шаблон без повторных чисел в egrep

Мне нужна помощь в поиске регулярного выражения для соответствия всем последовательностям цифр, которые не имеют повторяющейся цифры. Пример:

198345 -> соответствует.

198315 -> не соответствует (1 повторяется дважды)

Как я могу достичь этого в grep\egrep ?

4 Solutions collect form web for “Найдите шаблон без повторных чисел в egrep”

Если вам нужно сделать это с помощью регулярного выражения, см . Замечательный ответ Стефана на аналогичный вопрос .

Если регулярное выражение не является обязательным, я предлагаю вам альтернативу Perl:

 perl -nle ' $digits{$_}++ for /([0-9])/g; @repeated = grep { $digits{$_} > 1 } keys %digits; print @repeated? "":"$_" %digits = (); ' your_file 

Это предполагает, что your_file имеет по одному номеру в строке и распечатает только те цифры, цифры которых уникальны.

Интересный вопрос. Спасибо. Ответ, который я нашел немного жутким:

 egrep -v '([0-9])[0-9]*\1' 

pattern найдите вхождение цифры [0-9] , сохраните ее в \1 и проверьте на отсутствие повторения. Поэтому он находит любую цифру, за которой следует одна и та же цифра. Использовать -v для обратного

Редактировать:

Ниже приведены одинаковые цифры: они соответствуют 1123456 (последовательные 1 с), но не 1213456 (не последовательные 1):

Хлопое решение:

 cat testfile | grep [0-9] | grep -v "0\{2,\}" | grep -v "1\{2,\}" | grep -v "2\{2,\}" | grep -v "3\{2,\}" | grep -v "4\{2,\}" | grep -v "5\{2,\}" | grep -v "6\{2,\}" | grep -v "7\{2,\}" | grep -v "8\{2,\}" | grep -v "9\{2,\}" 

Первый grep сопоставляет числа, а остальные 10 grep гарантируют, что каждое число появляется только один раз.

Более компактный, но все же хромой способ:

 cat test | grep [0-9] | grep -v "1\{2,\}\|2\{2,\}\|3\{2,\}\|4\{2,\}\|5\{2,\}\|6\{2,\}\|7\{2,\}\|8\{2,\}\|9\{2,\}\|0\{2,\}" 

testfile должен содержать по одному слову в строке.

 grep '\([[:digit:]]\) *\1 *\1' 

Он принимает цифру [[:digit:]] и запоминает ее \( ... \) . Он, чем пытается сопоставить любое количество пробелов * (включая ничего вообще), помните символ \1 , любое количество пробелов, запоминающийся символ. Вы можете попробовать запустить его с помощью --color=auto чтобы увидеть, какие части входных данных совпадают.

  • Как запустить многопоточную grep в терминале?
  • Как сопоставить строку в файле, но только если строка находится в первом поле?
  • Греп из файла с двойным gzip
  • Групповое совпадение с grep включает дополнительные символы
  • agrep с направленными смещенными штрафами
  • ограничивать контекст grep частью строки результата
  • Найти последнее появление строки в заданном типе файла во всех подкаталогах
  • Что делает grep, когда он не запускает CPU?
  • Выполнять независимые greps в одном сценарии оболочки
  • Соответствие двух файлов для аналогичной первой строки
  • содержание grep между двумя стартовыми скобками
  • Как показать только скрытые каталоги, а затем найти скрытые файлы отдельно
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.