Найдите шаблон без повторных чисел в 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 из / etc / passwd
  • Почему perl regex находит шаблон \\ label \ {. *? \}, Но не \\ ref. *? \} Или \\ autoref \ {. *? \} В файлах TeX?
  • Удалите совпадающую строку и еще несколько из файла
  • Как вывести отступ grep?
  • Рекурсивный grep vs find / -type f -exec grep {} \; Что более эффективно / быстрее?
  • Как использовать grep с файлами в произвольной кодировке, без установленного языкового стандарта и без sudo?
  • Чтобы grep 20 символов после и после матча
  • На сервере HP-UX опция grep -r не работает
  • grep caret, похоже, не имеет эффекта
  • Перенаправить вывод с несколькими командами
  • Только grep для строк, содержащих только алфавитные символы
  • Linux и Unix - лучшая ОС в мире.