通过替换函数将一个文件的内容合并到另一个文件中

通过替换函数将一个文件的内容合并到另一个文件中

我正在编写一个 shell 脚本,它从另一个程序获取数据,我使用该变量值从文件中读取内容,在对其进行一些修改后,继续附加到不同的文件:

下面是一个例子:

readonly file_location=$location
readonly client_id = $id
readonly client_types = $type_of_client

这里 $location、$id 和 $type_of_client 值是从另一个程序传递的。下面是一个例子:

$location 将是完整路径名,如下所示:/home/david/data/12345678 $id 将是数字:120 $type_of_client 将是空格分隔的单词:abc def pqr

现在,在这个位置中,/home/david/data/12345678我有这样的文件:abc_lop.xmldef_lop.xmlpqr_lop.xml.含义_lop.xml始终相同,因此我们可以对其进行硬编码。我们只需要迭代client_types变量并创建一个如上所示的文件名,并将页眉和页脚附加到这些文件中并创建一个新文件。所以我用下面的代码让这部分工作得很好:

#!/bin/bash

readonly file_location=$location
readonly client_id=$id
readonly client_types=$type_of_client

client_value=`cat "$file_location/client_$client_id.xml"`

for word in $client_types; do
    fn="${word}"_new.xml
    echo "$word"
    echo '<hello_function>' >>"$fn"
    echo '<name>Data</name>' >>"$fn"
    cat "$file_location/${word}_lop.xml" >>"$fn"
    echo '</hello_function>' >>"$fn"
done

现在我需要做的第二件事是:我有另一个 xml 文件,它是client_$client_id.xml.我需要将生成的_new.xml文件复制到client_$client_id.xml特定位置。下面是我client_120.xml需要在其中添加生成的_new.xml文件。我需要用我生成的_new.xml文件替换整个下面的函数。

<?xml version="1.0"?>

<!-- some data -->

        <function>
            <name>TesterFunction</name>
            <datavariables>
                <name>temp</name>
                <type>string</type>
            </datavariables>
            <blocking>
                <evaluate>val = 1</evaluate>
            </blocking>
        </function>
    </model>
</ModelMetaData>

因此,如果这是我生成的_new.xml文件:我需要将整个文件复制到上面的文件中并TesterFunction用它替换整个文件。

<hello_function>
<name>Data</name>
<Hello version="100">

<!-- some stuff here -->

</Hello>
</hello_function>

所以最终的输出将是这样的:

<?xml version="1.0"?>

<!-- some data -->

    <hello_function>
    <name>Data</name>
    <Hello version="100">

    <!-- some stuff here -->

    </Hello>
    </hello_function>
    </model>
</ModelMetaData>

答案1

这应该可以做到:

#!/bin/bash

readonly file_location="$location"
readonly client_id="$id"
readonly client_types="$type_of_client"

## Define the header and footer variables
header='<hello_function>
<name>Data</name>'
footer='</hello_function>'

for word in $client_types
do
    ## Concatenate the header, the contents of the target file and the
    ## footer into the variable $file.
    file=$(printf '%s\n%s\n%s' "$header" "$(cat "$file_location/${word}_lop.xml")" "$footer")

    ## Edit the target file and print
    perl -0pe "s#<function>\s*<name>DUMMYPMML.+?</function>#$file#sm"  model_"$client_id".xml
done

相关内容