Bash 删除两个图案之间的线条而不删除图案

Bash 删除两个图案之间的线条而不删除图案,bash,perl,shell,Bash,Perl,Shell,我有一个像下面这样的文件 [NAMES] biren bikash dibya [MAIL] biren_k bikash123 dibya008 我的输出应该如下所示 [NAMES] [MAIL] 我尝试使用下面的代码只是为了删除名称和邮件之间的行,但没有成功 sed -n '/NAMES/{p; :a; N; /MAIL/ba; s/.*\n//}; p' input.txt 有人能帮忙吗。。。我更喜欢perl代码,如果有的话 注意:像[NAMES]和[MAIL]一样,我的实际文件

我有一个像下面这样的文件

[NAMES]
biren
bikash
dibya

[MAIL]
biren_k
bikash123
dibya008
我的输出应该如下所示

[NAMES]

[MAIL]
我尝试使用下面的代码只是为了删除
名称
邮件
之间的行,但没有成功

sed -n '/NAMES/{p; :a; N; /MAIL/ba; s/.*\n//}; p' input.txt
有人能帮忙吗。。。我更喜欢perl代码,如果有的话


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

您可以根据需要修改
sed

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

请尝试以下内容,这可能对您的问题有所帮助:

%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
%hashes=(
“[名称]”=>“
kumar
avi

\n”, “[邮件]”=>“
biren_k
bikash123
dibya008
\n” ); 我的@arr=; 每个我的$snarr(@arr) { chomp($snarr); push(@newarr,“$snarr\n$hashes{$snarr}”),如果($hashes{$snarr}); } 打印@newarr; __资料__ [姓名] 比伦 比卡什 迪比亚 [邮件] 比伦乌克 比卡什123 dibya008
只需替换
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";
}
#/usr/bin/env perl
严格使用;
使用警告;
推送@ARGV,'file.txt';
#这里列出标题
#你想删除哪些内容
我的@erase=qw[
名字
邮寄
];
我的%dump;
我的$header;
#从您的文件生成哈希
而(){
如果(/^\[([^\]]+)\]$/){
$header=$1;
$dump{$header}=“”;
下一个
}
$dump{$header}.=$\if$header;
}
#替换内容
#带空字符串
foreach(@erase){
$dump{$\}=“”;
}
#现在将其打印回
foreach(排序键%dump){
打印“[$\]\n$dump{$\}\n”;
}

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

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);
my@name_var=();
而()
{
最后一个if($\u=~/^\ n/);
推送(@name\u var,$\u);
}
我的@mail_add=();
而()
{
最后一个if($\u=~/^\ n/);
推送(@mail\u add,$);
}
打开(my$var,“input.txt”)| | die(“未找到输入文件”);
打开(my$out,“>temp.txt”)| | die(“未创建临时文件”);
而($line=)
{
#打印$行;
如果($line=~/\[NAMES\]/)
{
打印$out$行;
打印$out$name\u var;
而($line=)&&($line!~/^\n/)
{
}
}
如果($line=~/\[MAIL\]/)
{
打印$out$行;
打印$out$mail\u add;
而($line=)&&($line!~/^\n/)
{
}
}       
打印$tcf_out$行;
}
收盘价(var);
收尾(美元);
打开($var1,“>input.txt”)||模具(“打开失败\n”);

打开($out1),“你能简单解释一下为什么不能用基线文件(即
[NAMES][MAIL]
)覆盖该文件吗?祝你好运。
perl-00-nalwe'print$F[0]”
[NAMES]
[MAIL]
,我的文件中有很多标题。我想用新行替换每个标题下的所有行。首先,我需要删除每个标题下的行。。这就是我所需要的@shellterwell,@mpapec的答案看起来可以回答你的问题。祝你好运。非常感谢……你能帮我把行放在
[姓名]下面吗
现在…我需要输出为“[NAMES]
kumar
avi

biren_k
bikash123
dibya008
嗨,我使用了像这样的
系统(“sed-i's/\[NAMES\]/\[NAMES\]\nbiren\n/g'input.txt”)的代码
在perl代码中…它不工作..你能帮我吗out@biren.K我不知道为什么要在perl中运行该程序。为什么不从bash运行sed?还要在
[NAME]
[MAIL]之间包含行
这些值是随机给定的还是从其他文件中获取的?这些值是从其他文件中获取的。我被要求使用perl脚本来完成这项工作。这就是为什么我要问..@biren.K。在这种情况下,您根本不需要使用
sed
。perl可以自己处理所有事情。试试看。祝您好运