我有一个这种格式的input.txt文件:
DP_00296.1: 1-2, 72- 82
DP_00575.1: 63 -68, 206 - 208
DP_00389.1: 486-, 493-499, 529- 544
我想清除一些格式: i)清除可能出现在" - "之前或之后的空间。 ii)如果" - "没有后跟任何数字,删除" - "
对于上面的input.txt,我想最终的output.txt如:
DP_00296.1: 1-2, 72-82
DP_00575.1: 63-68, 206-208
DP_00389.1: 486, 493-499, 529-544
请建议一次性完成工作的perl代码(最好是一个衬垫),而不是在正则表达式中替换两次?
ps:我为我的方法@zdim和@Jim Garrison道歉......实际上,我正在寻找我感到满意的正则表达式。这是我试过的:
#!/usr/bin/perl
local $/=undef;
open(FILE, "input.txt") || die ("Error\n");
$string = <FILE>;
$string =~ s/\s//g;
print "$string";
由于
答案 0 :(得分:2)
尝试将其作为一个班轮来做可能比它的价值更麻烦。解析它,清理它,重新组装,然后再打印出来。
您的基本行格式非常简单:
key: value, value, value, ...
首先,从:
上的值中拆分键。
my($key, $value) = split /:/, $line;
然后用逗号分隔值。
my @values = split /,/, $value;
现在,您可以悠闲地从每个值中删除空白。
# This works because $_ in a for loop is an alias, not a copy
s/\s+//g for @values;
再次将线组装回来。
say "$key: ".join(", ", @values);
答案 1 :(得分:1)
在每一行上,捕获数字并评估替换部分中的简单条件
addToBackStack("null")
使用perl -pe 's/(\d+)\s*-\s*(\d*)/ $2 ? "$1-$2" : "$1" /xge' input.txt
修饰符,替换部件将被评估为代码。见in perlop和in perlretut。
我们需要在第二个数字中使用/e
量词来匹配成功,以便执行替换。问题指出只有第二个数字可能会丢失,同时它还允许唯一的数字不存在破折号,因此第一个数字有*
。
+
设置循环输入,将-p
设置为当前行,并在处理后打印它。