Perl программа для замены вкладок пробелами - PullRequest
7 голосов
/ 14 мая 2011

Я хотел бы написать однострочник Perl, который заменяет все вкладки '\ t' в пакете текстовых файлов в текущем каталоге пробелами, не влияя на видимый интервал.

Может кто-нибудь показать мне, как это сделать?

Ответы [ 6 ]

22 голосов
/ 14 мая 2011

Это в FAQ :

1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;

Или вы можете просто использовать модуль Text::Tabs (часть стандартного дистрибутива Perl).

use Text::Tabs;
@expanded_lines = expand(@lines_with_tabs);
13 голосов
/ 14 мая 2011

Для этого вам не нужен однострочный Perl, вместо этого вы можете использовать expand:

Утилита expand записывает файлы или стандартный ввод в стандартный вывод с заменой символов на один или несколько символов, необходимых для дополнения до следующей остановки табуляции.

Утилита expand даже позаботится о том, чтобы управлять таб-стопами для вас, и это, кажется, является частью вашего требования «без влияния на видимый интервал», а Perl с одной линией, вероятно, не будет (но держу пари кто-то здесь может предоставить одну строку, которая будет).

6 голосов
/ 14 мая 2011

Использовать Текст :: Вкладки .Следующее очень незначительно адаптировано из документации:

perl -MText::Tabs -n -i.orig -e 'print expand $_' *
5 голосов
/ 14 мая 2011

perl -p -i -e 's/\t/ /g' file.txt будет одним из способов сделать это

1 голос
/ 14 мая 2011
$ perl -wp -i.backup -e 's/\t/    /g' *
0 голосов
/ 15 мая 2011

Вы можете использовать s/// для достижения этой цели. Возможно, у вас есть строка текста, хранящаяся в $ line:

$line =~ s/\t/    /g;

Это должно заменить каждую вкладку (\t) четырьмя пробелами. Это зависит только от того, сколько пробелов находится на одной вкладке в вашем файле.

Вот кое-что, что должно сделать это довольно быстро для вас; отредактируйте его как хотите.

open(FH, 'tabz.txt');

my @new;

foreach my $line (<FH>) {
    $line =~ s/\t/    /g; # Add your spaces here!
    push(@new, $line);
}

close(FH);

open(FH, '>new.txt');
printf(FH $_) foreach (@new);
close(FH);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...