![정규 표현식: 별개의 하위 문자열이 있는 문자열 찾기](https://linux55.com/image/213065/%EC%A0%95%EA%B7%9C%20%ED%91%9C%ED%98%84%EC%8B%9D%3A%20%EB%B3%84%EA%B0%9C%EC%9D%98%20%ED%95%98%EC%9C%84%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%B4%20%EC%9E%88%EB%8A%94%20%EB%AC%B8%EC%9E%90%EC%97%B4%20%EC%B0%BE%EA%B8%B0.png)
내 코드에서 잘못된 매개변수가 있는 모든 문자열을 찾고 싶습니다. 이것이 내가 하고 싶은 일이다:
다음 항목을 모두 찾습니다.
CreateNewPoint(CorrectPoint.X, IncorrectPoint.Y, other_parameters)
CreateNewPoint(IncorrectPoint.X, CorrectPoint.Y, other_parameters)
다음 항목을 모두 무시합니다.
CreateNewPoint(CorrectPoint.X, CorrectPoint.Y, other_parameters)
내 예에서는 변수 이름을 사용하고 있지만 CorrectPoint
이는 IncorrectPoint
무엇이든 될 수 있습니다.
나는 다음과 같은 것을 생각하고 있습니다 :
CreateNewPoint(\(.*\)\.X, \1\.Y, .*)
그러나 나는 동일한 변수 이름을 사용하지만 다른 변수 이름을 사용하는 라인에는 관심이 없습니다.
답변1
grep
플래그 와 함께 및 사용 -P
(" PATTERN
Perl 정규식으로 해석됨"), 당신은 그것을 사용할 수 있습니다부정적인 예측.
grep -P 'CreateNewPoint\((.*)\.X, ((?!\b\1\b).)*\.Y, .*\)' /tmp/codefile
(?!\b\1\b)
다음 항목은 단어 경계로 둘러싸인 이전에 일치한 단어일 수 없음을 의미합니다( 를 사용하면\b
해당 문자열이 누락될 수 있음).포함하다첫 번째 게임은 아니지만정확히 똑같다그것에.((?!\b\1\b).)*
- 뒤에 오는 내용도 일치시키길 원하기 때문에 모든 문자를 확인하고(단어와 일치하지 않는지 확인하고) 일치시키도록\.Y, .*\)
지시해야 합니다 .grep
\.Y
vim
를 사용하여 유사한 일치를 수행할 수 있습니다 /CreateNewPoint(\(.*\)\.X, \(\(\<\1\.\)\@!.\)*\.Y, .*)
. grep
몇 가지 예외를 제외하면 정규식과 유사 합니다 .
\@!
부정적인 예측 식별자입니다.\<
단어의 시작입니다(\b
단어 경계가 아님).- 끝 부분에 단어 경계가 아니라 점으로 끝날 수 없다는 뜻입니다
\.
.