Você precisará de -P
para a PCRE, que implementa a antecipação% Perl (?!...)
negativa e para não escapar da !
na (?!...)
.
-bash-4.2$ cat input
<?php
<?xml
<?=
<?okay
<?
-bash-4.2$ grep -P '<\?(?!php|xml|=)' input
<?okay
<?
-bash-4.2$
"<\?(?\!php|=|xml)"
está incorreto, pois isso passa (?\!...)
para grep
e ?\!
não é totalmente ?!
no que diz respeito ao mecanismo de expressões regulares; se você não tiver certeza do que está sendo passado para um programa pelo shell, escreva algum código para inspecionar isso:
$ perl -E 'printf "%*vd\n","\t",$ARGV[0];say join "\t",split //,$ARGV[0]' "?\!"
63 92 33
? \ !
$
Ou use algo como strace
para ver o que o grep
obteve:
-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$