또는 를 사용하여 일치시키면서 동시에 VAR_NAME
생략 할 수 있는 방법은 무엇입니까 ? 지금까지의 최선의 시도는 다음과 같습니다.$(VAR_NAME)
grep
egrep
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 앞 줄에 왼쪽 괄호가 없는 경우에만 충분합니다. 귀하가 게시한 정규식은 이를 고려하지 않으므로 이것이 문제가 되지 않는다고 가정합니다.