删除行上字符之间的所有空格而不创建一个巨大的单行

时间:2012-07-03 14:15:09

标签: perl replace

我目前面临的问题似乎很容易处理,但到目前为止我还没能解决。我有一个“管道分隔值”文件,我想删除每一行上所有值的所有前导和尾随空格。该文件可能包含多行。

示例:

1|     | Field2     | Field3
2| 123 | Field2     |
3|     |            | Field3

删除空格后我想要的是什么:

1||Field2|Field3
2|123|Field2|
3|||Field3

只要最后一个字段(在本例中为Field3)不为NULL,我到目前为止的工作。这对应于上述示例中的第2行。当最后一个字段为NULL时,它将该行与下一个字段连接起来,创建比预期更大的行。

到目前为止我的代码就是这个:

$res =~ s/\s*\|\s*/\|/g;

如前所述,只要所有行上的最后一个字段不为NULL,就可以正常工作。我试图提出一个正则表达式,匹配除了最后一个管道之外的所有管道但到目前为止没有成功。

我知道如何删除所有空格并保持线路完整性吗?

提前致谢,

若昂

2 个答案:

答案 0 :(得分:5)

正则表达式/\s/匹配回车符和换行符(以及其他内容)以及空格和制表符,因此您的替换将删除具有空最终字段的记录上的尾随换行符。

尝试

$res =~ s/[ \t]*\|[ \t]*/|/g;

$res =~ s/[ ]*\|[ ]*/|/g;

如果您对删除制表符不感兴趣。

(替换字符串中的管道不需要转义。)

答案 1 :(得分:0)

my $file_data = <<DATA;
1|     | Field2     | Field3
2| 123 | Field2     |
3|     |            | Field3
DATA

foreach my $line (split /[\n\r]/, $file_data) {
    my @fields;

    foreach my $field (split /\|/, $line) {
            $field =~ s/^\s*(.*?)\s*$/$1/;
            push @fields, $field;
    }

    print join '|', @fields;
    print "\n";
}