Substituindo linhas em arquivos com o conteúdo do arquivo

2

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:

  1. file1.php : está vazio
  2. file2.php : <p>Hello
  3. 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.

    
por qbi 19.12.2012 / 10:11

5 respostas

3

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
    
por 19.12.2012 / 15:56
2
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
    
por 19.12.2012 / 11:05
2

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 ...

    
por 19.12.2012 / 10:49
1

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 ?> .

    
por 19.12.2012 / 15:56
0

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.

  1. Exclua as tags <?php e ?> .
  2. Exclua a linha 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.
  3. Repita as etapas para outras instruções include .

exemplo

$ 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 .

    
por 19.12.2012 / 10:46