숫자를 반복하지 않고 모든 숫자 시퀀스와 일치하는 정규식을 찾고 싶습니다. 예:
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
일치하는 입력 부분을 확인할 수 있습니다.