删除两个模式之间的行而不删除模式

时间:2014-11-17 12:07:11

标签: bash perl shell

我有一个如下文件

[NAMES]
biren
bikash
dibya

[MAIL]
biren_k
bikash123
dibya008

我的输出应该如下

[NAMES]

[MAIL]

我尝试使用以下代码只是为了删除NAMESMAIL之间的行,但它不起作用。

sed -n '/NAMES/{p; :a; N; /MAIL/ba; s/.*\n//}; p' input.txt

任何人都可以帮忙吗...我更喜欢perl代码...

注意:与[NAMES][MAIL]一样,我的实际文件中有很多标题。这里我刚刚展示了两个标题。我必须用新内容替换标题下面的内容(不是全部,只有随机行号的选定标题)。但首先我要删除它们下面的内容。这就是为什么我需要这样的输出。有任何建议请...

4 个答案:

答案 0 :(得分:1)

您可以将sed修改为

$ sed '/\[NAMES\]/, /\[MAIL\]/ {/^\[/p; d}' input
[NAMES]
[MAIL]
biren_k
bikash123
dibya008

答案 1 :(得分:0)

请尝试这可能对您的问题有所帮助:

%hashes = (
"[NAMES]" => "<br/>kumar<br/>avi<br/><br/>\n",
"[MAIL]" => "<br/>biren_k<br/>bikash123<br/>dibya008<br/>\n"
);

my @arr = <DATA>;
foreach my $snarr(@arr)
{
    chomp($snarr);
    push(@newarr, "$snarr\n$hashes{$snarr}"), if( $hashes{$snarr} );
}

print @newarr;


__DATA__
[NAMES]
biren
bikash
dibya

[MAIL]
biren_k
bikash123
dibya008

答案 2 :(得分:0)

只需将my @erase = qw[];之间的行替换为您要清空的标题。

#!/usr/bin/env perl
use strict;
use warnings;

push @ARGV, 'file.txt';
# here list out the HEADERS
# which content you wanna erase
my @erase = qw[
    NAMES
    MAIL
];

my %dump;
my $header;
# build a hash from your file
while (<>) {
  if (/^\[([^\]]+)\]$/) {
    $header = $1;
    $dump{$header} = "";
    next;
  }
  $dump{$header} .= $_ if $header;
}

# replace the content
# with empty string
foreach (@erase) {
  $dump{$_} = "";
}

# now print it back to <STDOUT>
foreach (sort keys %dump) {
  print "[$_]\n$dump{$_}\n";
}

答案 3 :(得分:0)

我在这里找到了解决问题的方法:

my @name_var = ();
while (<STDIN>)
{
  last if ($_ =~ /^\n/ );
  push(@name_var, $_);
}

my @mail_add = ();
while (<STDIN>)
{
  last if ($_ =~ /^\n/ );
  push(@mail_add, $_);
}

open(my $var, "input.txt") || die("Input File not found");
open(my $out, ">temp.txt") || die("Temp File not created");
while($line = <$var>)
{
   # print $line;
    if( $line =~ /\[NAMES\]/)
    {
      print $out $line;
      print $out $name_var;

     while(($line = <$var>) && ($line !~ /^\n/))
      {
      }
    }

    if( $line =~ /\[MAIL\]/)
    {
      print $out $line;
      print $out $mail_add;

     while(($line = <$var>) && ($line !~ /^\n/))
      {
      }
    }       
    print $tcf_out $line;
}

close($var);
close($out);
open($var1,">input.txt") || die("failed to open\n");
open($out1,"<temp.txt") || die("failed to open\n");
while($fl = <$out1>)
{ 
  print $var1 $fl;
}
close($var1);
close($out1);

谢谢大家。我从堆栈溢出,perlmonk以及与perl相关的更多站点获得了解决方案。

相关问题