0

我的案子在这里。

我有包含#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 的工作非常紧迫。

预先感谢!!!!!普斯法拉吉

4

3 回答 3

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
于 2013-10-10T10:28:00.223 回答
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
于 2013-10-10T10:33:44.033 回答
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个解决方案:

通过如下更改 sed 行,为每个用户保留一个 ldif 文件:

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

您还必须更改add.ldif为仅包含 1member:行。

或者,在脚本中构建 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

我相信第二种解决方案更优雅。

于 2013-10-10T10:36:56.987 回答