2013-09-16 57 views
1

替換文本塊我有2個文件:的oldfile和newfile中,其結構是類似的,它們只包含微小的變化桑達從2檔

我需要從newfile中與來自的oldfile塊替換文本塊(如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設置和包含空格的空行

現在我想將該輸出插入到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命令可以分爲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 
+0

對不起,但這似乎並沒有工作,如果我理解正確這應該取代[=]後的所有值,但我只想要某個塊,還有其他值,我不想被替換。另外當我運行它時,它不會對新文件進行更改 – anarchist

+0

發佈新文件樣本。另外,awk不會更改新文件,您需要將輸出重定向到單獨的文件,然後將其移回到新文件e。g'awk -F'[=] +''FNR == NR {a [$ 1] = $ 0; next} {$ 0 = a [$ 1]}中的$ 1 1'oldfile newfile> _temp && mv _temp newfile' – anubhava

+0

好的這在某種程度上是有效的:它取代了成功的塊,但是還有其他的行=,最後我在新文件 – anarchist

2

以下sed命令將替換ldap.tmp內容的LDAP設置部分:

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

謝謝,這個工程,唯一的問題是,我得到2#LDAP設置行 – anarchist

+0

你可以從ldap.tmp中刪除LDAP設置行嗎? – dogbane

+0

我不知道如何做到這一點,如果我使用LDAPUrl =等另一個分隔符,那麼我的tmp文件中沒有任何輸出 – anarchist