Reputation: 3616
My case is here.
I have file that contains #file_user
mark
sebastian
lewis
shumacher
hulkenburg
I have another file contains 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
In the above i want to change the uid=user to the respective file user names
example
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
I tried using this but i couldn't acheive the above example.
#!/bin/bash
set -x
for q in `cat user`
do sed 's/user/'${q}'/g' add.ldif > out
done
Please suggest me how to do this. Meanwhile i'll understand advanced bash scripting
This very urgent for my work in ldap.
Thank in advance!!!!! Puspharaj
Upvotes: 0
Views: 1044
Reputation: 7497
You have two problems with your script:
The first is that you use the >
operator which will produce unwanted results for your use in a loop. It means that for each user in the file, you run sed
and overwrite the contents of out
, so I'm guessing that in the above example all the 'member:' lines will contain user=hulkenburg.
You may want to use the >>
operator instead, which appends to a file instead of overwriting it. But it is still useless, for the second reason:
You are using sed, which runs through the entire file and replaces all instances of user
to whatever's in $q
. Even if you run with the append operator, you'll end up with a out
file which looks like this:
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
Which is probably not what you want. I suggest 2 solutions:
keep a ldif file for each user, by changing the sed line as follows:
do sed 's/user/'${q}'/g' add.ldif > out.${q}
You'll have to change add.ldif
as well to contain only 1 member:
line.
Or, build the ldif file in a script. Have the contents of add.ldif look like this:
dn: cn=salespartner,ou=Groups,o=company
changetype: modify
add: member
Then, run the following script:
#!/bin/bash -x
for q in `cat user`
do echo "member: uid=${q},ou=external,c=de,ou=People,o=company" >> add.ldif
done
I believe that the second solution is more elegant.
Upvotes: 0
Reputation: 781058
sed
is probably not the best tool for this, since you don't want to make the same substitution on all lines. awk
can do it better:
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
Upvotes: 4
Reputation: 785186
This awk should work:
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
Upvotes: 2