我需要修改包含大量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。 –