VAR_NAME과 일치하지만 $(VAR_NAME)과 일치하지 않음

VAR_NAME과 일치하지만 $(VAR_NAME)과 일치하지 않음

또는 를 사용하여 일치시키면서 동시에 VAR_NAME생략 할 수 있는 방법은 무엇입니까 ? 지금까지의 최선의 시도는 다음과 같습니다.$(VAR_NAME)grepegrep

egrep -nH '*[^(]VAR_NAME' $i

그러나 이는 행이 VAR_NAME으로 시작하는 경우와 일치하지 않습니다. 반면에 다른 경우에는 정확하게 일치합니다.

답변1

하지만 이는 줄이 VAR_NAME으로 시작하는 경우와 일치하지 않습니다.

따라서 해당 사례를 다음에 추가하십시오.

egrep -nH '*[^(]VAR_NAME|^VAR_NAME' $i

|왼쪽 패턴이나 오른쪽 패턴과 일치합니다. 일치 ^하지 않는 부분은 []줄의 시작 부분입니다.


이것이 제외되는 다른 경우도 있다는 점에 유의하십시오. (VAR_NAME)선행 항목이 없는 경우 $는 1입니다.토토의 대답그것과 일치해야합니다.

그러나 그것조차도 $(VAR_NAME other stuff닫는 괄호가 없는 것과 같은 경우를 놓칠 것입니다. 이는 다음을 두 번 사용하여 해결할 수 있습니다 grep.

grep -nH 'VAR_NAME' $i | grep -v '$(VAR_NAME)'

grep을 처음 사용하면 포함된 모든 줄을 가져오고 VAR_NAME, 두 번째는 플래그를 사용하여 -v첫 번째 줄의 출력을 필터링합니다.제거하다일치하는 모든 것 $(VAR_NAME).

답변2

부정문을 사용하세요뒤를 돌아보다플래그 사용 -P(Perl 정규 표현식):

grep -P '(?<!\$\()VAR_NAME' 

VAR_NAME이 앞에 오지 않는 경우에만 일치합니다 $(.

$(정규식에서 특별한 의미를 갖기 때문에 이스케이프해야 합니다 .

답변3

왼쪽 괄호가 앞에 오지 않는 한 줄의 어느 곳에서나 이름과 일치하는 정규식이 필요합니다.

문제에 대한 해결책은 다음 정규식입니다. '^[^(]*VAR_NAME'. 줄이 0개 이상의 왼쪽 괄호가 아닌 문자로 시작하는 경우에만 VAR_NAME과 일치합니다.

참고: 이는 VAR_NAME 앞 줄에 왼쪽 괄호가 없는 경우에만 충분합니다. 귀하가 게시한 정규식은 이를 고려하지 않으므로 이것이 문제가 되지 않는다고 가정합니다.

관련 정보