用文件linux中的sed替换单词

时间:2013-10-10 10:12:48

标签: linux bash sed

我的情况就在这里。

我的文件包含#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

3 个答案:

答案 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

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