Мне нужно изменить файл, содержащий огромное количество ldifs. В основном структура файла похожа на это. Я называю этот файл файлом-1.Изменение n-й строки после сопоставления шаблону
cn: username1
gidNumber: 222
loginShell: /bin/bash
objectClass: inetOrgPerson
objectClass: shadowAccount
uid: username1
mail:
cn: username2
...
Поэтому мне нужно совместить cn: example1, а затем изменить соответствующую почту: i.e 6-я строка после сопоставления. У меня есть еще один файл с именем file-2, из которого я собираюсь изменить новое значение. Файл-2 имеет такой синтаксис.
username1 [email protected]
username2 [email protected]
...
Так что я хочу сделать вот так. Возьмите username1 из файла-2, сопоставьте его в файле-1, если совпадение найдено, затем измените 6-ю строчку из соответствия (например, почта: в приведенном выше случае) на соответствующее значение [email protected], взятое из файла-2. Выполнение этого для всех значений в файле-2.
Как достичь этого с помощью sed или awk? Я сделал эту первую неудачную попытку.
input=file-2
a="sn: "
b="mail: "
while read -r line
do
read -r f1 f2 <<<"$line"
c=$b$f2
d=$a$f1
sed -i 's/\($d\)\(.*\)/\1$c/' file-1
done<"$input"
Вы можете только использовать sed и awk? В противном случае вы всегда можете попробовать попробовать Perl – delephin
Вы не должны делать это, подсчитывая количество строк после 'cn:'. Если кто-то изменит формат файла-1, чтобы было больше строк, или строки находятся в другом порядке, ваш код не будет работать и должен быть изменен. Или, что еще хуже, количество строк может даже не быть известно во время компиляции, если некоторые строки являются необязательными или если части после ':' разрешено содержать символы новой строки. Вместо этого вы должны написать код, который найдет первую строку 'mail:' после строки 'cn:'. –
@delephin На самом деле я мало что знаю о perl. Я знаю некоторые основные из sed и awk. –