我正在编写一个 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.xml
、def_lop.xml
和pqr_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