如何在unix shell脚本中替换到另一个文件

时间:2015-03-11 10:07:53

标签: shell unix sed

我有两个文件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

1 个答案:

答案 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