首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配模式修改后的第n行

匹配模式修改后的第n行
EN

Stack Overflow用户
提问于 2014-01-08 18:47:55
回答 2查看 890关注 0票数 1

我需要修改一个包含大量ldifs的文件。基本上文件的结构是这样的。我把这个文件叫做文件-1。

代码语言:javascript
复制
 cn: username1
 gidNumber: 222
 loginShell: /bin/bash
 objectClass: inetOrgPerson
 objectClass: shadowAccount
 uid: username1
 mail:

 cn: username2
 ...

所以我需要匹配cn: example1,然后更改相应的邮件:即匹配后的第6行。我有另一个名为file-2的文件,我将在其中使用新的值进行修改。具有如下语法的文件-2。

代码语言:javascript
复制
 username1 abc@email.com
 username2 bcd@email.com
 ...

所以我想这样做。取username1从文件-2匹配它在文件-1,如果找到匹配,然后修改第6行从匹配(即邮件:在上述情况下)到相应的值abc@email.com从文件-2。对文件-2中的所有值执行此操作。

如何使用sed或awk来实现这一点?我已经做了这一次失败的尝试。

代码语言:javascript
复制
 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"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-08 18:58:48

下面这样的内容应该可以工作(如script.awk):

代码语言:javascript
复制
NR==FNR {
    m[$1]=$2
    next
}

$1=="cn:" { u=$2 }

$1=="mail:" {
    print "mail: " m[u]
    next
}

1

awk -f script.awk file-2 file-1的身份运行。

NR==FNR位遍历第一个文件中的所有行(因为所看到的总记录号NR与当前文件的记录号NR相同)。在这样做的同时,它构建了一个关联数组/散列,将用户名映射到电子邮件地址。

然后,脚本的其余部分捕获了最近看到的用户名( $1=="cn:" bit) and stores that in a variable. When the script next sees a line that starts withmail:(the$1=="mail:“位),它打印出mail: <the saved email for the currently stored username>并继续前进。

最后的1只是awk的缩写,表示打印当前行(模式的操作默认为{print},任何计算为true的模式都将运行其操作)。任何非零的非空字符串值都可以代替1

票数 2
EN

Stack Overflow用户

发布于 2014-01-08 18:59:22

给出用户名->电子邮件映射到一个名为emails.txt的文件中,并且这个script.awk

代码语言:javascript
复制
NR == FNR { emails[$1] = $2; next }
$1 == "cn:" { username = $2; }
$1 == "mail:" { print $1, emails[username]; next }
1

您可以通过以下方式运行映射文件和ldif文件:

代码语言:javascript
复制
awk -f script.awk emails.txt file.ldif
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21004058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档