首页 > 解决方案 > 如何删除以“[”开头以“]”结尾的行片段以及括号中的所有字符([和]除外)?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

我想删除方括号中的所有数据

标签: regexperl

解决方案


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

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

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

现在看看你的输入。在任何换行符之后都找不到任何>. 结果是您的代码将整个输入文件作为第一个输入行读取。

可能的解决方案是:

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

第 2 部分:正则表达式

请记住,eg[]in 正则表达式具有特殊含义。如果你想“从字面上”使用它们,你必须用反斜杠转义它们。

另一句话是,在“打开”之后,[您应该匹配一个不同于]only 的字符序列。

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

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

推荐阅读