我有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中并替换现有的类似文本。
答案 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