2013-10-10 29 views
0

我的情況就在這裏。用sed從文件中替換一個詞linux

我有文件,其中包含#file_user

mark 
sebastian 
lewis 
shumacher 
hulkenburg 

我有另一個文件包含Add.ldif

dn: cn=salespartner,ou=Groups,o=company 
changetype: modify 
add: member 
member: uid=user,ou=external,c=de,ou=People,o=company 
member: uid=user,ou=external,c=de,ou=People,o=company 
member: uid=user,ou=external,c=de,ou=People,o=company 
member: uid=user,ou=external,c=de,ou=People,o=company 

在上述我想改變的UID =用戶到相應文件的用戶名

例如

dn: cn=typo3_frontend_global_salespartner,ou=Groups,o=company 
changetype: modify 
add: member 
member: uid=mark,ou=external,c=de,ou=People,o=company 
member: uid=sebastian,ou=external,c=de,ou=People,o=company 
member: uid=lewis,ou=external,c=de,ou=People,o=company 

我試過用這個,但是我無法達到上面的例子。

#!/bin/bash 
set -x 
for q in `cat user` 
do sed 's/user/'${q}'/g' add.ldif > out 
done 

請告訴我如何做到這一點。同時我會理解高級bash腳本

這對我在ldap中的工作非常迫切。

預先感謝!!!!! Puspharaj

+0

用戶文件中的名稱可能比'Add.ldif'中的'member'行更多嗎? – Barmar

回答

4

sed可能不是最好的工具,因爲您不想在所有行上進行相同的替換。 awk可以做的更好:

awk 'BEGIN { i = 0; j = 0; } 
    FNR == NR { users[i++] = $0 } 
    FNR != NR && /^member:/ && users[j] { sub("uid=user", "uid=" users[j++]); print } 
    FNR != NR && !/^member:/ {print}' user add.ldif > out 
2

這AWK應該工作:

awk -F, 'FNR==NR{a[NR]=$1;next} $1~"user"{sub(/=user/, "=" a[++i], $1)} 1' OFS=, user add.ltif 
changetype: modify 
add: member 
member: uid=mark,ou=external,c=de,ou=People,o=company 
member: uid=sebastian,ou=external,c=de,ou=People,o=company 
member: uid=lewis,ou=external,c=de,ou=People,o=company 
member: uid=shumacher,ou=external,c=de,ou=People,o=company 
0

你有兩個問題,你的腳本:

第一個是您使用>運營商將產生不必要的您在循環中使用的結果。這意味着對於文件中的每個用戶,您運行sed並覆蓋out的內容,所以我猜測在上面的示例中,所有'member:'行都將包含user = hulkenburg。 您可能希望使用>>運算符,該運算符附加到文件而不是覆蓋文件。但它仍然是無用的,第二個原因:

您正在使用sed,它貫穿整個文件並將user的所有實例替換爲$q中的任何實例。即使你用追加操作運行,你會得到一個out文件看起來像這樣結束:

dn: cn=typo3_frontend_global_salespartner,ou=Groups,o=company 
changetype: modify 
add: member 
member: uid=mark,ou=external,c=de,ou=People,o=company 
member: uid=mark,ou=external,c=de,ou=People,o=company 
member: uid=mark,ou=external,c=de,ou=People,o=company 

dn: cn=typo3_frontend_global_salespartner,ou=Groups,o=company 
changetype: modify 
add: member 
member: uid=sebastian,ou=external,c=de,ou=People,o=company 
member: uid=sebastian,ou=external,c=de,ou=People,o=company 
member: uid=sebastian,ou=external,c=de,ou=People,o=company 

這可能不是你想要的。我建議2個解決方案:

保持ldif文件爲每個用戶,通過改變sed的行,如下所示:

do sed 's/user/'${q}'/g' add.ldif > out.${q} 

你必須改變add.ldif以及只含有1 member:線。

或者,在腳本中構建ldif文件。有添加的內容。LDIF是這樣的:

dn: cn=salespartner,ou=Groups,o=company 
changetype: modify 
add: member 

然後,運行以下腳本:

#!/bin/bash -x 
for q in `cat user` 
    do echo "member: uid=${q},ou=external,c=de,ou=People,o=company" >> add.ldif 
done 

我認爲,第二種解決方案是更優雅。