在Solaris上使用带有sed的正则表达式匹配和替换块

时间:2018-03-29 14:26:24

标签: sed solaris solaris-10

这正在使用regex101.com等一些工具,但我无法使用sed。

阻止:

dn: abcd1,ou=test
aaaaa
bbbb
1111

dn: abcd2,ou=test
33333
ddddd
aaaaa

dn: qwert,ou=test
55555
hhhh
dddd

我希望每个以dn: abcd开头的块都匹配并替换。一个块总是以\n\n结尾。

Regexp:(?s)\b(?:(?!\n\n).)*?\bdn: abcd\b(?:(?!\n\n).)*

是否可以用sed实现?

3 个答案:

答案 0 :(得分:1)

是完成此任务的更好选择。

$ perl -00ne 'print if not /^dn: abcd/' file

$ perl -ne 'print if not /^dn: abc/ .. /^$/' file

dn: qwert,ou=test
55555
hhhh
dddd

答案 1 :(得分:1)

使用awk的段落模式

$ awk -v RS= '!/^dn: abcd/' ip.txt
dn: qwert,ou=test
55555
hhhh
dddd
  • -v RS=当RS设置为空字符串时,一个或多个连续的空行用作输入记录分隔符
  • !/^dn: abcd/忽略以dn: abcd
  • 开头的段落

请注意,默认输出记录分隔符是单个换行符,因此您可能需要以下内容:

$ awk -v RS= -v ORS='\n\n' '!/^dn: abcd1/' ip.txt
dn: abcd2,ou=test
33333
ddddd
aaaaa

dn: qwert,ou=test
55555
hhhh
dddd

答案 2 :(得分:0)

你可以试试这个sed

sed '/^dn: abcd/,/^$/d' infile