2013-10-10 2 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

Может ли быть больше имен в файле пользователя, чем 'member' в' Add.ldif'? – 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 

Я считаю, что второе решение является более элегантным.

Смежные вопросы