사용법을 찾아봐야겠네요짧은 오픈 라벨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$