[英]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.