Estas são substituições do PHP de qualquer forma, então basta executá-lo através do php:
$ php file-main.php
foo
bar
baz
<p>Hello
World</p>
more content
$ php file-main.php > file-main-new.php
Eu tenho vários arquivos que contêm algum PHP include
s e quero substituí-los com o conteúdo do arquivo. O arquivo parece com
foo
<?php
include("file1.php");
?>
bar
baz
<?php
include("file2.php");
include("file3.php");
?>
more content
Então, depois de foo
deve ser o conteúdo de file1.php e depois de baz
deve ser o primeiro conteúdo de file2.php seguido por file3.php.
Também quero remover as tags <?php
e ?>
nos dois casos. O que é uma boa maneira de resolver isso?
Suponha o seguinte conteúdo do arquivo:
file1.php
: está vazio file2.php
: <p>Hello
file3.php
: World</p>
Assim, o arquivo resultante deve se parecer com:
foo
bar
baz
<p>Hello
World</p>
more content
As palavras foo
, bar
etc. são apenas palavrões dentro do arquivo real, pode haver qualquer texto.
k=1
while read line
do
if [[ "${line}" == "<?php" ]] || [[ "${line}" == "?>" ]]; then
:
elif [[ "${line}" =~ "include" ]]; then
((k++))
file=$line
while read include_line
do
echo $include_line | grep -Ev '<\?php|\?>' >> newfile.php
done <${file:9:9}
# cat file$k.php >> newfile.php
else
echo $line >> newfile.php
fi
done </tmp/inputfile
awk wrapped:
awk '
/</ || /\?>/ {next;}
/include/ {
if (match($0,"\".*php")){
f = substr($0,RSTART+1,RLENGTH-1);
while ( getline < f ){
print;
}
}
next;
}
{print;}
' YOURFILE
Pode incorporar em shell, consertar seu one-liner, ou salvar em um script awk que é recomendado ...
Dependendo de como seus dados são estruturados, você pode fazer isso com sed:
<infile.php sed -n 's:include("\([^"]\+\)");:/&/ { r \nd }:p' |
sed -f - -e '/<\?php\|\?>/d' infile.php
A primeira chamada de sed escreve um script sed com linhas como:
/include("file1.php");/ { r file1.php
d }
Que substituem as linhas correspondentes pelo conteúdo do arquivo mencionado. O último sed então executa este script junto com /<\?php\|\?>/d
, que exclui as linhas com <?php
e ?>
.
Haveria melhores soluções do awk, sed, perl para isso. Mas estou dando uma dica de edição simples de vim
que pode ser usada aqui, que é usada para inserir o conteúdo de um arquivo em outro.
<?php
e ?>
. include
e insira o respectivo conteúdo do arquivo usando :r file1.php
. Isto irá inserir o conteúdo do arquivo file1.php
na próxima linha do cursor. include
. $ cat file1.txt
This is a content in file1.
As capturas de tela mostram as alterações
Oconteúdodefile1.txt
écolocadonomainFile.txt
Você pode verificar mais sobre :r
na ajuda do vim ou este link de referência .