이 질문이 이전에 요청된 것 같지만 답변을 찾는 데 어려움을 겪고 있으며 가능성의 조합이 놀라울 정도입니다. 많은 리소스가 거의 비슷한 것을 제공하지만 grep에서 문제를 올바르게 해결하기 위한 표현을 얻을 수 없습니다.
나는 단어 목록을 만들기 위해 크런치와 영숫자 출력을 사용하고 있습니다.
crunch 8 8 ABCDEFGHIJKLMNOPQRSTUVWXYZ + 1234567890 -t %@%@%@%@
그러면 다음과 같이 문자와 숫자가 포함된 8자리 영숫자 문자열이 출력됩니다.
1A1A1A1A1A
1A1A21B2A3
1A1A31A1A3
...
저는 출력을 grep으로 파이프하려고 시도했습니다. 여기서 최종 결과는 모든 패턴 반복에서 모든 문자를 생략한 출력이 됩니다. 패킹된 출력의 특성상 연속적인 반복은 제거되었습니다. 불연속적인 것을 생략하는 올바른 표현 방법이 있나요? 아니면 긴축을 통해 이를 수행할 수 있는 방법이 있습니까?
1A1A1A1A1A not output
1A1A21B2A3 not output
1A1A31A1A3 not output
acceptable output:
1A2B3C4D
1B2A3D4C
1C3A2F5G
이 표현을 이해하는 데 도움을 주시면 대단히 감사하겠습니다.
답변1
역참조 사용:
grep -v '\(.\).*\1'
-v
다시 말하면 v
(일치하지 않는 줄 인쇄) 정규식은 \(.\)
캡처된 단일 문자, 그 뒤에 임의의 수의 문자( .*
), \1
이전에 캡처된 동일한 문자가 옵니다.