여러 문자열에 대한 부정적 예측

여러 문자열에 대한 부정적 예측

사용법을 찾아봐야겠네요짧은 오픈 라벨PHP 파일에서 이는 일치 <?하지만 일치하지 않음 을 <?php의미 합니다 . 대부분의 정규식 스타일에서는 다음과 같습니다.<?xml<?=

 <\?(?!php|xml|=)

그러나 다음 줄은 원하지 않는 <?php, <?xml<?=부분과 일치합니다.

$ grep -r -E "<\?(?\!php|=|xml)" *

나는 백슬래시 -P-e플래그의 다양한 순열을 시도했습니다.GNU grep에서 부정 예측을 올바르게 사용하는 방법은 무엇입니까?

센트OS 7.3(KDE 데스크탑),GNU grep 2.20(온라인 문서는 3.0용이지만 man로컬에 있습니다.)네슬레 디카페인 커피(실제로는 그럴 수도 있다.진짜질문).

답변1

Perl 부정 예측을 -P구현하려면 PCRE가 필요합니다 .(?!...)아니요탈출했습니다 .!(?!...)

-bash-4.2$ cat input
<?php
<?xml
<?=
<?okay
<?
-bash-4.2$ grep -P '<\?(?!php|xml|=)' input
<?okay
<?
-bash-4.2$ 

"<\?(?\!php|=|xml)"(?\!...)정규식 엔진에 전달되고 정규식 엔진과 전혀 관련되지 않기 때문에 올바르지 않습니다 grep. ?\!?!이 프로그램에 무엇을 전달하는지 확실하지 않은 경우 확인하기 위해 몇 가지 코드를 작성하십시오.

$ perl -E 'printf "%*vd\n","\t",$ARGV[0];say join "\t",split //,$ARGV[0]' "?\!"
63  92  33
?   \   !
$ 

또는 다음과 같은 것을 사용하여 무엇을 얻을 수 있는지 strace확인하십시오 .grep

-bash-4.2$ strace -o grep grep "?\!grep" /etc/passwd
-bash-4.2$ grep grep grep
execve("/usr/bin/grep", ["grep", "?\\!grep", "/etc/passwd"], [/* 24 vars */]) = 0
-bash-4.2$ 

관련 정보