我需要修改包含大量ldif的文件。基本上文件的結構就是這樣。我把這個文件稱爲file-1。匹配模式後修改第n行
cn: username1
gidNumber: 222
loginShell: /bin/bash
objectClass: inetOrgPerson
objectClass: shadowAccount
uid: username1
mail:
cn: username2
...
因此,我需要匹配cn:example1然後更改相應的郵件:即匹配後的第6行。我有另一個名爲file-2的文件,我將從中獲取新值來修改。文件2具有這樣的語法。
username1 [email protected]
username2 [email protected]
...
所以我想這樣做。如果找到匹配項,則從file-2取得username1並將其與file-1匹配,然後將匹配的第6行(即上面的情況中的mail)修改爲從file-2取得的對應值[email protected]。爲文件-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:'之後的行數來做到這一點。如果有人更改了file-1的格式以便有更多的行,或者行的順序不同,那麼代碼將會失敗並需要修改。或者更糟糕的是,如果某些行是可選的,或者':'之後的部分允許包含換行符,編譯時甚至可能不會知道行數。相反,你應該編寫在你的'cn:'行之後找到第一個'mail:'行的代碼。 –
@delephin其實我對perl知之甚少。我知道一些基本的sed和awk。 –