伙计们,
我有一个包含ldap条目的文件,我想删除第二次出现的"version:1"行.我知道sed可以做这样的事情,但由于我很新,我不知道如何继续.这是Solaris 10计算机,文件如下所示:
version: 1
dn: uid=tuser1,ou=people,o=example.com,o=isp
cn: tuser1
uidNumber: 3
gidNumber: 3
homeDirectory: /export/home/tuser1
loginShell: /bin/sh
objectClass: posixAccount
objectClass: shadowAccount
objectClass: account
objectClass: top
uid: tuser1
shadowLastChange:
userPassword:
version: 1
dn: uid=tuser2,ou=people,o=example.com,o=isp
uidNumber: 20
cn: tuser1
gidNumber: 3
homeDirectory: /export/home/tuser2
loginShell: /bin/sh
objectClass: posixAccount
objectClass: shadowAccount
objectClass: account
objectClass: top
uid: tuser1
shadowLastChange:
userPassword:
version: 1
dn: uid=tuser3,ou=people,o=example.com,o=isp
uidNumber: 10
cn: tuser3
gidNumber: 3
homeDirectory: /export/home/tuser3
loginShell: /bin/sh
objectClass: posixAccount
objectClass: shadowAccount
objectClass: account
objectClass: top
uid: tuser3
shadowLastChange:
userPassword:
version: 1
dn: uid=loperp,ou=people,o=example.com,o=isp
uid: loperp
userPassword:
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
sn: pop
cn: loper
version: 1
dn: uid=tuser4,ou=people,o=example.com,o=isp
userPassword:
uid: tuser4
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
sn: User4
cn: Test
Run Code Online (Sandbox Code Playgroud)
sed -ni '0,/version: 1/{p; d}; /version: 1/!p' ldap.txt
Run Code Online (Sandbox Code Playgroud)
编辑:这最初是错误的.当第一行不是版本时,它打印重复.
GNU版本更简单.它p从开头打印()直到匹配版本正则表达式的第一行(包括两者).此外,对于该范围内的每一行,打印后我们删除模式空间并开始一个新的循环(d).基本上,这意味着转到脚本的开头和下一行(这避免了双重打印).与(标准)不同1,/regex/,如果第一行匹配,则不会继续到另一个匹配行.
如果我们没有d(因此我们在第一个之后version: 1),那么我们只需打印与正则表达式(!)不匹配的每一行.
使用标准sed):
sed -ni 'p; /version: 1/ b nov; d; :nov /version: 1/!p; n; b nov' ldap.txt
Run Code Online (Sandbox Code Playgroud)
这首先只需打印每一行(p).在那次打印之后,如果我们匹配正则表达式,我们分支到nov(无版本)标签; 标签名称取决于我们.如果我们不分支,我们(d)删除模式空间并开始一个新的循环(换行符,脚本开头).在nov,如果不匹配,我们打印该行(与GNU相同).然后我们去一个新的线路,然后分支回到nov.此循环一直持续到结束.
我(Jonathan Leffler)可以确认@ kuti对Solaris 10标准'sed'的观察; 有效的是:
/bin/sed -n 'p
/version: 1/ b nov
d
:nov
/version: 1/!p
n
b nov' ldap.txt
Run Code Online (Sandbox Code Playgroud)
Solaris"sed"似乎没有普遍使用"冒号代替换行符"的"冒号".具体地说,至少在使用标签后不能有分号.
这似乎有效:
/bin/sed -n 'p; /version: 1/ b nov
d; :nov
/version: 1/!p; n; b nov' ldap.txt
Run Code Online (Sandbox Code Playgroud)
(我无法想象如何在评论中提供修复 - 多行格式在这里至关重要.)
| 归档时间: |
|
| 查看次数: |
174 次 |
| 最近记录: |