在Solaris上使用regex与sed匹配并替换块

在Solaris上使用regex与sed匹配并替换块,sed,solaris,solaris-10,perl,Sed,Solaris,Solaris 10,Perl,这是一些工具上的工作,如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:(?!\n\n)。*?\bdn:abcd\b(?(?!\n\n)。* 是否可以使用sed实现?是执行此任务的

这是一些工具上的工作,如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:
(?!\n\n)。*?\bdn:abcd\b(?(?!\n\n)。*

是否可以使用sed实现?

是执行此任务的更好选择

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

是执行此任务的更好选择

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


使用awk的段落模式

$awk-vrs='/^dn:abcd/'ip.txt
dn:qwert,ou=测试
55555
啊
dddd
  • -v RS=
    当RS设置为空字符串时,一个或多个连续的空行用作输入记录分隔符
  • /^dn:abcd/
    忽略以
    dn:abcd开头的段落
请注意,默认的输出记录分隔符是单换行符,因此您可能需要如下内容:

$awk-vrs=-vrs='\n\n'/^dn:abcd1/'ip.txt
dn:abcd2,ou=测试
33333
DDD
AAAA
dn:qwert,ou=测试
55555
啊
dddd

使用awk的段落模式

$awk-vrs='/^dn:abcd/'ip.txt
dn:qwert,ou=测试
55555
啊
dddd
  • -v RS=
    当RS设置为空字符串时,一个或多个连续的空行用作输入记录分隔符
  • /^dn:abcd/
    忽略以
    dn:abcd开头的段落
请注意,默认的输出记录分隔符是单换行符,因此您可能需要如下内容:

$awk-vrs=-vrs='\n\n'/^dn:abcd1/'ip.txt
dn:abcd2,ou=测试
33333
DDD
AAAA
dn:qwert,ou=测试
55555
啊
dddd
你可以试试这个

sed '/^dn: abcd/,/^$/d' infile
你可以试试这个

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

尝试使用
perl
。。。sed不支持lookarounds或非捕获组以及perl中提供的许多其他功能……此外,如果您可以在不使用
\n
的情况下修改给定的输入示例(假设您有文字换行,而不是
\
后跟
n
),请使用
{}
按钮,以格式化样本而不是倒勾。。并添加完整的预期输出,这将有助于建议解决方案。@Sundeep已编辑,谢谢!我不熟悉perl,知道吗?试试使用
perl
。。。sed不支持lookarounds或非捕获组以及perl中提供的许多其他功能……此外,如果您可以在不使用
\n
的情况下修改给定的输入示例(假设您有文字换行,而不是
\
后跟
n
),请使用
{}
按钮,以格式化样本而不是倒勾。。并添加完整的预期输出,这将有助于建议解决方案。@Sundeep已编辑,谢谢!我不熟悉perl,知道吗?