在 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 是这个任务的更好选择。
$ 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
这与 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 是这个任务的更好选择。
$ 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