如何在unix中使用null的特定字符后替换文件中的多行

时间:2014-11-26 12:04:45

标签: unix sed

例如,如果我的文件包含

{z:
abdc
cabdfd
cabdfd
casfdbf
cdff
-}$

找到字符串值{z:之后,最多-}之后的多行必须用空字符替换,并且它应该在整个文件中全局遵循相同的过程。

这必须在Unix中完成我尝试使用sed命令搜索多行但是无法成功使用它。

2 个答案:

答案 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
}