用文件内容替换文件中的行

用文件内容替换文件中的行

我有几个包含一些 PHP 的文件include,我想用文件内容替换它们。该文件看起来像

foo
<?php
include("file1.php");
?>
bar
baz
<?php
include("file2.php");
include("file3.php");
?>
more content

因此,afterfoo应该是 file1.php 的内容,afterbaz应该是 file2.php 的第一个内容,然后是 file3.php。我还想删除这两种情况下的<?php和标签。?>有什么好的方法可以解决这个问题吗?

假设以下文件内容:

  1. file1.php: 是空的
  2. file2.php:<p>Hello
  3. file3.php:World</p>

所以生成的文件应该如下所示:

foo
bar
baz
<p>Hello
World</p>
more content

单词foobar只是真实文件中的咒骂语,可以有任何文本。

答案1

无论如何,这些都是 PHP 替代品,所以只需通过 php 运行它:

$ php file-main.php 
foo
bar
baz
<p>Hello
World</p>
more content


$ php file-main.php > file-main-new.php

答案2

awk 包装:

awk '
    /</ || /\?>/ {next;} 
    /include/ {
        if (match($0,"\".*php")){
            f = substr($0,RSTART+1,RLENGTH-1);
            while ( getline < f ){
                print;
            }
        } 
        next;
    } 
    {print;}
' YOURFILE

可以嵌入到 shell 中,修改你的单行代码,或者保存到 awk 脚本中(推荐)...

答案3

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

答案4

对于这个问题,会有更好的 awk、sed、perl 解决方案。但我给出了一个vim可以在这里使用的简单编辑技巧,用于将文件的内容插入到其他文件中。

  1. 删除<?php?>标签。
  2. 删除该include行,然后使用 插入文件的相应内容:r file1.php。这会将文件的内容插入file1.php到光标的下一行。
  3. 对其他此类语句重复这些步骤include

例子

$ cat file1.txt
This is a content in file1.

屏幕截图显示了更改

前

的内容file1.txt被放置在mainFile.txt
后

您可以:r在 vim 帮助中查看更多信息或这个参考链接

相关内容