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

Match and replace block using regex with sed on Solaris

这与 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.

结尾

正则表达式:(?s)\b(?:(?!\n\n).)*?\bdn: abcd\b(?:(?!\n\n).)*

用sed可以实现吗?

是这个任务的更好选择。

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

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

dn: qwert,ou=test
55555
hhhh
dddd

使用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

你可以试试这个 sed

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