有选择地清除文件内容perl

时间:2016-12-09 06:27:53

标签: perl

我有一个这种格式的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";

由于

2 个答案:

答案 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 perlopin perlretut

我们需要在第二个数字中使用/e量词来匹配成功,以便执行替换。问题指出只有第二个数字可能会丢失,同时它还允许唯一的数字不存在破折号,因此第一个数字有*

+设置循环输入,将-p设置为当前行,并在处理后打印它。