Sed替换2个文件中的文本块

时间:2013-09-16 13:52:22

标签: bash shell scripting sed

我有2个文件:oldfile和newfile,结构相似,只包含很小的更改

我需要使用oldfile中的块替换newfile中的文本块(作为bash脚本)

在oldfile中我有:

...文字

#######################################################################
# LDAP Settings
LDAPUrl = ldap://xxx
LDAPSearchBase = CN=Users,DC=xx,DC=xxx,DC=xx
LDAPSearchSecondary = ***
LDAPSearchFilter = cn=xxx
LDAPUser = CN=***,CN=Users,DC=xx,DC=xxx,DC=xx
LDAPPassword = ***
LDAPAuthenticateServer = ldap://test:389
ProsourceKey = ****

#######################################################################

......其他文字

newfile是相同的,只有参数值被更改。

我使用sed从oldfile获取此输出,如下所示: getldap = sed -n '/^# LDAP Settings$/,/^$/p' oldfile > ldap.tmp(它将它存储在ldap.tmp中)

使用了分隔符:#LDAP Settings和包含空格的空行

现在我想将该输出插入到newfile中并替换现有的类似文本。

2 个答案:

答案 0 :(得分:4)

正确工作的正确工具,这里awk将比sed更好地满足您的要求。

这个awk应该可以工作:

awk -F '[= ]+' 'FNR==NR{a[$1]=$0;next} $1 in a{$0=a[$1]}1' oldfile newfile

更新:要将替换限制为# LDAP Settings,您只能执行以下操作:

awk -F '[= ]+' 'FNR==NR && /^# LDAP Settings$/{r=1;next} FNR==NR && r && /^$/{r=0;next} 
   r && FNR==NR{a[$1]=$0;next} FNR!=NR{if($1 in a)$0=a[$1];print}' oldfile newfile

<强>解释

这个awk命令可以分为两个部分:

-F '[= ]+' - Use field separator = or space or both
FNR == NR - First file is being processed
FNR != NR - Second file is being processed
FNR == NR && /^# LDAP Settings$/ - In 1st file if # LDAP Settings is found set r=1
r && FNR==NR - a[$1]=$0 - In 1st file if r=1 then
a[$1]=$0 - Store 1st field as key in array a and $0 (whole line) as value
FNR==NR && r && /^$/ - In 1st file if r=1 and empty line found then set r=0

FNR!=NR{if($1 in a)$0=a[$1];print} In 2nd file if $1 exists in a then set whole line as 
                                   value of array a. Then print the whole line

答案 1 :(得分:2)

以下sed命令将使用ldap.tmp的内容替换LDAP设置部分:

sed '/^# LDAP Settings$/,/^$/ {//!d}; /^# LDAP Settings$/r ldap.tmp' newfile