我有两个文件test01和test02,如下所示
Test01文件:
RX_HOME=/app/rx/rx01/mxIII
SCR_HOME=/app/scr/scr01/mxIII
JAVA_HOME=/opt/java/jdk1.7.0_51
SYBASE_HOME=/opt/sybase
ORACLE_HOME=/opt/oracle/11202
MX_HOST=ukloldk008
DB_HOST=ukloldk0004
Test02文件:
<MX_HOME>;
SCR_HOME;
;JAVA_HOME;
"SYBASE_HOME"
{ORACLE_HOME}
[MX_HOST]
\DB\DB_HOST\HOST\
我想要一个unix脚本,它将读取test01文件,并将test01中变量的值替换为test02,只要变量名称出现在test02文件中。我的结果应该如下面的test02文件
</app/rx/rx01/mxIII>;
/app/px/px01/mxIII;
;/opt/java/jdk1.7.0_51;
"/opt/sybase"
{/opt/oracle/11202}
[ukloldk008]
\DB\ukloldk0004\HOST\
你能帮忙吗
因为我写了一个脚本但没有得到所需的结果,当我使用sed得到(sed:非法选项 - 我)错误
#! /bin/bash
while IFS='=' read f1 f2
do
perl -pi -e 's/$f1/$f2/g' test02
done< test01
答案 0 :(得分:0)
当您将变量$ f1和$ f2放入单引号时,shell不会展开它们。它们被解释为Perl变量,但它们是空的。切换到双引号。
此外,由于变量可能包含斜杠,因此您无法将其用作替换中的分隔符。切换到其他角色:
while IFS== read f1 f2 ; do
perl -i~ -pe "s=$f1=$f2=g" test02
done < test01
如果文件很大,在Perl中完成整个工作可能会更快:
perl -e 'while (not eof) {
chomp(($k, $v) = split /=/, <>);
$h{$k} = $v;
}
$re = join "|", keys %h;
while (<>) {
s/($re)/$h{$1}/g;
print;
}' test01 test02 > test02.new