【发布时间】:2011-08-25 05:46:08
【问题描述】:
我想编写一个 Perl 单行代码,将当前目录中的一批文本文件中的所有制表符 '\t' 替换为空格,而不影响可见间距。
谁能教我怎么做?
【问题讨论】:
我想编写一个 Perl 单行代码,将当前目录中的一批文本文件中的所有制表符 '\t' 替换为空格,而不影响可见间距。
谁能教我怎么做?
【问题讨论】:
perl -p -i -e 's/\t/ /g' file.txt 是一种方法
【讨论】:
$ perl -wp -i.backup -e 's/\t/ /g' *
【讨论】:
您不需要 Perl 单行代码,您可以使用 expand 代替:
expand 实用程序应将文件或标准输入写入标准输出,并将字符替换为填充到下一个制表位所需的一个或多个字符。
expand 实用程序甚至会为您管理制表位,这似乎是您“不影响可见间距”要求的一部分,Perl 单行可能不会(但我敢打赌这里有人可以提供一条单线)。
【讨论】:
这是FAQ:
1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
或者您可以只使用Text::Tabs 模块(标准 Perl 发行版的一部分)。
use Text::Tabs;
@expanded_lines = expand(@lines_with_tabs);
【讨论】:
使用Text::Tabs。以下内容仅略微改编自文档:
perl -MText::Tabs -n -i.orig -e 'print expand $_' *
【讨论】:
perl -MText::Tabs -ni -e 's/\s*$//;s/\s*\r/\n/g;print expand $_,"\n"'
您可以使用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);
【讨论】: