繁体   English   中英

如何在UNIX Shell脚本中将替换到另一个文件中

[英]How to do in place replacement into another file in unix shell scripting

我有两个文件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:非法选项-i)错误

#! /bin/bash
while IFS='=' read f1 f2
do
perl -pi -e 's/$f1/$f2/g' test02
done< test01

将变量$ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM