[user@notebook ~]$ printf 'adgaa alpha lajsd assa ><>4 saf\n63SXYZae fkrk safXYZek\nsaf betf!%saa sDGFXYZFalf\n'
adgaa alpha lajsd assa ><>4 saf
63SXYZae fkrk safXYZek
saf betf!aa sDGFXYZFalf
[user@notebook ~]$
[user@notebook ~]$ printf 'adgaa alpha lajsd assa ><>4 saf\n63SXYZae fkrk safXYZek\nsaf betf!%saa sDGFXYZFalf\n' | grep SOMEMAGIC
63SXYZae fkrk safXYZek
[user@notebook ~]$
질문:주어진 문자열이 두 번 있는 줄만 찾기 위해 grep하는 방법은 무엇입니까? 이 예에서 문자열은 "XYZ"입니다. 두 문자열 사이에는 무엇이든 있을 수 있습니다.
답변1
두 번 greping하면 아무 소용이 없습니다. 귀하의 필요에 맞는 정규 표현식과 함께 egrep을 사용하기로 선택하겠습니다.
ps ax | egrep '(a.*){2}'
이렇게 하면 "a"가 두 번 있는 모든 프로세스가 제공됩니다. 물론 egrep이 읽을 수 있는 모든 유형의 입력에 사용할 수 있습니다.
답변2
정규 표현식을 사용하면 다음을 수행할 수 있습니다.역참조그룹화 (
패턴 )
또는 일치 항목 이 {
반복 되도록 지정할 수 있습니다 }
. 둘 사이의 차이는 중요합니다. 간단한 예로 문자열을 고려해보세요.
baa
...다음 패턴 모두와 일치하는 경우:
\([ba]\)\{2\}
\([ba]\)\1
첫 번째 경우, 패턴이 단일 문자를 검색하기 때문에 그룹화는 실제로 관련이 없습니다. 반복을 지정할 때 그룹화에 대해 유일하게 중요한 점은 반복이 참조할 수 있는 전체 하위 표현식을 포함할 수 있다는 것입니다. 따라서 이 간단한 예제의 경우...
[ba]\{2\}
... 그리고...
\([ba]\)\{2\}
...동의어이며 일치 엔진이 두 문자로 구성된 입력에서 가장 왼쪽에 있는 가장 긴 문자열을 찾아야 한다는 의미로 이해될 수 있습니다.두번째또는ㅏ. 반복 적용 대상무늬이것은 만든다성냥그리고아니요대회 내용에. 문자 그대로 다음을 의미합니다.
[ba][ba]
....같은 방법으로...
\(a.*\)\{2\}
...방법...
a.*a.*
...이것은 단일 문자에 대해 잘 작동합니다.ㅏ그러나 이는 일치하는 문자열을 다시 일치시키는 방법에 대한 좋은 예가 아닙니다.
입력 샘플의 경우 이는 다음과 같습니다.
ba
그러나 역참조는 매우 다릅니다.공모 내용. 간단한 예시 사례...
aa
...이것은 입력에서 가장 왼쪽에 있는 가장 긴 문자열이고 하위 표현식의 패턴과 일치하는 문자로 구성되며 [ba]
바로 뒤에 가 오기 때문입니다.그 자체- 문자와 일치하는 패턴이 아닙니다.
그래서 당신은 다음을 원합니다:
\(pattern\).*\1
정규 표현식이기 때문에무늬그리고 일치하는 문자열은 동일하지 않습니다. 그렇지 않으면 애초에 정규식을 사용하는 호출이 많지 않을 것입니다. 약간 더 복잡한 입력 예시를 통해 차이점을 보여주려면 다음을 고려하세요.
printf %s\\n 123ABC321 123ABC123 321ABC321 |
grep '\([123]\{3\}.*\)\{2\}'
위 내용은 다음과 grep
같이 인쇄됩니다.
123ABC321
123ABC123
321ABC321
...왜냐하면 모든 경우에무늬경기는 두 번 성공했습니다. 그러나 해당 grep
줄이 다음으로 대체되면:
grep '\([123]\{3\}\).*\1'
...그냥 인쇄됩니다...
123ABC123
321ABC321