我的情况就在这里。
我的文件包含#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 = user更改为相应的文件用户名
示例
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 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
您的脚本有两个问题:
首先,您使用的>
运算符会产生不需要的结果,供您在循环中使用。这意味着对于文件中的每个用户,您运行sed
并覆盖out
的内容,因此我猜测在上面的示例中所有'member:'行将包含user = hulkenburg 。
您可能希望使用>>
运算符,它附加到文件而不是覆盖它。但它仍然没用,第二个原因是:
您正在使用sed,它运行整个文件并将user
的所有实例替换为$q
中的任何内容。即使你使用append运算符运行,你最终会得到一个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文件。 add.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
我相信第二种解决方案更优雅。