egrep에서 반복되는 숫자가 없는 패턴 찾기

egrep에서 반복되는 숫자가 없는 패턴 찾기

숫자를 반복하지 않고 모든 숫자 시퀀스와 일치하는 정규식을 찾고 싶습니다. 예:

198345 -> 일치합니다.

198315 -> 일치하지 않음(1이 두 번 반복됨)

어떻게 이를 달성할 수 있습니까 grep\egrep?

답변1

흥미로운 질문입니다. 감사해요. 나는 이 답변이 약간 소름끼친다고 생각합니다.

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

패턴은 숫자의 발생을 찾아서 [0-9]저장 \1하고 중복되지 않는지 확인합니다. 따라서 동일한 숫자가 뒤에 오는 임의의 숫자를 찾습니다. -v역 으로 사용됨

답변2

이를 위해 정규식을 사용해야 하는 경우 다음을 참조하세요.비슷한 질문에 대한 Stephen의 훌륭한 답변.

정규 표현식이 필요하지 않은 경우 Perl 대안을 제공합니다.

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

이는 your_file한 줄에 하나의 숫자가 있다고 가정하고 숫자가 고유한 숫자만 인쇄합니다.

답변3

편집하다:

다음과 같은 동일한 숫자는 연속적으로 나타나야 합니다. 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한 줄에 하나의 단어가 있어야 합니다.

답변4

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

숫자가 필요 [[:digit:]]하고 그것을 기억합니다 \( ... \). 그런 다음 공백 수 *(공백 없음 포함), 기억된 문자 \1, 공백 수, 기억된 문자를 일치시키려고 시도합니다. 이를 실행하여 --color=auto일치하는 입력 부분을 확인할 수 있습니다.

관련 정보