例如,如果我的文件包含
{z:
abdc
cabdfd
cabdfd
casfdbf
cdff
-}$
找到字符串值{z:
之后,最多-}
之后的多行必须用空字符替换,并且它应该在整个文件中全局遵循相同的过程。
这必须在Unix中完成我尝试使用sed
命令搜索多行但是无法成功使用它。
答案 0 :(得分:1)
您可以在sed
中指定地址范围,以便对范围内的行执行操作
删除两种模式中的行
$ cat input
{z:
abdc
cabdfd
cabdfd
casfdbf
cdff
-}$
hello
world
$ sed '/^{z:$/, /$-}\$$/d' input
hello
world
/^{z:$/, /^-}\$$/
指定范围的开始和结束。 替换为空字符串
您可以将substitute命令用作
$ sed '/^{z:/, /-}\$$/s/.*//' input
hello
world
答案 1 :(得分:0)
如果我理解正确,请尝试以下perl解决方案
#!/usr/bin/perl
undef $/; ## register separator is undefined
my $t=<>; ## slurp all input to $t
$t =~ s/\{z:.*?\n-\}/\0/gs; ## substitute patt by \0
print $t;
用法:perl thisscript输入
如果您需要在模式中进行更复杂的转换,我建议:
#!/usr/bin/perl
undef $/; ## register separator is undefined
my $t=<>; ## slurp all input to $t
$t =~ s/(\{z:.*?\n-\})/norm($1)/gse; ## substitute patt by its norm
print $t;
sub norm{ my $s = shift;
## transform $s
return $s
}