Заменить один пробел несколькими пробелами в perl - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть требование заменить один пробел несколькими пробелами, чтобы второе поле всегда начиналось с определенной позиции (здесь 36 - всегда позиция второго поля).У меня есть сценарий Perl, написанный для этого:

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

Есть ли лучший подход с использованием регулярного выражения в = ~ s ///, чтобы я мог использовать его непосредственно в CLI вместо сценария.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Предполагая, что поля в ваших данных разграничены пробелами

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 вместо регулярного выражения)

Пожалуйста, дайте больше подробностей, если есть другие требования.

0 голосов
/ 21 февраля 2019

Один из подходов заключается в использовании простых форматов 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...