在perl中用多个空格替换单个空格

时间:2019-02-21 07:59:43

标签: perl

我需要用多个空格替换单个空格,以便第二个字段始终从特定位置开始(此处36始终是第二个字段的位置)。 我为此编写了一个perl脚本:

while(<INP>)
{
my $md=35-index($_," ");
my $str;
$str.=" " for(1..$md);
$_=~s/ +/$str/;
print "$_" ;
}

仅在=〜s ///中使用正则表达式还有什么更好的方法,以便我可以在CLI上直接使用它而不是脚本。

2 个答案:

答案 0 :(得分:3)

假设数据中的字段由空格分隔

while (<$fh>) {
    my ($first, @rest) = split;
    printf "%-35s @rest\n", $first;
}

第一个字段现在将变为36宽,由于-的原因,其左侧对齐,格式为printf。有关许多详细信息,请参见sprintf。其余部分在原始的以空格分隔的字段之间打印有单个空格,但可以根据需要进行操作(制表符分隔,固定宽度...)。

或者您可以通过将行分为两部分来保留第一个字段后的“其余”

while (<$fh>) {
    my ($first, $rest) = /(\S+)\s+(.*)/;
    printf "%-35s $rest\n", $first;
}

(或使用split ' ', $_, 2代替正则表达式)

如果还有其他要求,请提供更多细节。

答案 1 :(得分:2)

一种方法是使用普通的Perl格式:

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

my($first, $second, $remainder);
format STDOUT =
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$first,                            $second,$remainder
.

while (<DATA>) {
    ($first, $second, $remainder) = split(/\s+/, $_, 3);
    write;
}

exit 0;

__DATA__
ABCD TEST EFGH don't touch
FOO      BAR    FUD don't touch

测试输出。我可能误认为了各列,但您应该明白这一点:

$ perl dummy.pl
ABCD                               TEST    EFGH don't touch
FOO                                BAR     FUD don't touch

其他选项为Text::Table