1

我有 2 个文件:oldfile 和 newfile,它们的结构相似,它们只包含细微的变化

我需要用旧文件中的一个块替换新文件中的一个文本块(作为 bash 脚本)

在旧文件中,我有:

... 文本

#######################################################################
# 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 并替换现有的类似文本。

4

2 回答 2

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 命令可分为 2 个部分:

-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
于 2013-09-16T14:03:19.523 回答
2

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

sed '/^# LDAP Settings$/,/^$/ {//!d}; /^# LDAP Settings$/r ldap.tmp' newfile
于 2013-09-16T14:10:07.750 回答