Desculpe por usar a expressão perl oneliner em vez de sed, mas de alguma forma eu não consigo aprender / lembrar o regex de sed. Então você pode tentar isso:
$ cat somefile.php | tr '\n' '@@@' | perl -p -e 's/^(.*?)(<\?php.*?\?>)(.*$)/$1$3/' | tr '@@@' '\n' > somefile_1.php
Primeiro tr
é para alterar string de múltiplas linhas na string oneline. A string ' @@@
' é apenas um exemplo, pode ser qualquer string que não exista em nenhum arquivo que você queira editar (grep-lo primeiro apenas para ter certeza).
Em seguida, o comando perl está fazendo o trabalho real: usando grupos regex é spliting string em três partes - primeiro tudo antes da primeira ocorrência do bloco php, próximo bloco php em si e durar tudo depois do primeiro bloco php. Observe que o caractere ?
é usado para tornar a expressão curinga .*
non greedy e os outros pontos de interrogação devem ser ignorados.
O último tr
traz novas linhas de volta (ele tem que usar a mesma string que foi usada no primeiro tr
- neste exemplo ' @@@
').