我需要用多个空格替换单个空格,以便第二个字段始终从特定位置开始(此处36始终是第二个字段的位置)。 我为此编写了一个perl脚本:
while(<INP>)
{
my $md=35-index($_," ");
my $str;
$str.=" " for(1..$md);
$_=~s/ +/$str/;
print "$_" ;
}
仅在=〜s ///中使用正则表达式还有什么更好的方法,以便我可以在CLI上直接使用它而不是脚本。
答案 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