如何删除行的片段,以" ["结束于"]"和括号中的所有字符([和]除外)? Perl的

时间:2018-05-19 17:59:43

标签: regex perl

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

my $del1 = "[";
my $del2 = "]";
sub rings($){
    my ($line) = $_;
    my @lineArr = split(" ", $line);
    my $noSquareBrackets = $lineArr[0];
    $noSquareBrackets =~ s/[^$del1[^$del1$del2]*$del2$]//g;
    print "check: ", $noSquareBrackets, "\n";   
}
$/ = "\n>";
while(<>){
    /([^>]*)/;
    my $seq = $1;
    $seq =~s/\s//g;
    $seq = rings($seq);
}

删除正则表达式之前的打印与以前完全相同。有没有人注意到,为什么只有一个(第一个)文件行被打印出来,当我的.inp格式文件有很多行?

输入文件包含以下行:

line 1) c1(ccc(cc1)N)S(=O)(=O)[O-].c1(ccc(cc1)C)[NH3+]  1519987
line 2) [Ce]123456([O]7[Cu]89[N](=Cc%10c7c([O]5CC)ccc%10)CC[N]8=Cc5cccc(c5[O]19)[O]2CC)(ON(=O)=[O]6)(ON(=[O]4)=O)[O]=N(=O)O3    1100946

我想用括号

删除方括号中的所有数据

1 个答案:

答案 0 :(得分:1)

第1部分:为什么您的程序只打印1行

注意代码中的行$/ = "\n>";。 它设置记录分隔符的内容(字符序列处理的内容) 作为输入行的结尾)。

如您所见,它包含换行符,后跟>

现在看看你的输入。在任何新行之后都可以找到任何>。 结果是您的代码首先读取整个输入文件 输入行。

可能的解决方案是:

  • 在每行的开头添加>,但第一行。
  • 删除$/ = "\n>";指令,保留默认记录saparator 为"\n"

第2部分:正则表达式

请记住,例如正则表达式中的[]具有特殊含义。 如果你想“按字面意思”使用它们,你必须用反斜杠来逃避它们。

另一个评论是,在“打开”[之后,你应该匹配一个序列 字符不仅仅与]不同。

所以消除[...]的正则表达式应该是:

s/\[[^\]]*\]//g