我想编写一个Perl单行代码,用空格替换当前目录中一批文本文件中的所有选项卡'\ t',对可见间距没有影响。
有人能告诉我怎么做吗?
答案 0 :(得分:22)
这是FAQ:
1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
或者您可以使用Text::Tabs
模块(标准Perl发行版的一部分)。
use Text::Tabs;
@expanded_lines = expand(@lines_with_tabs);
答案 1 :(得分:13)
您不需要使用Perl单线程,您可以使用expand
代替:
expand 实用程序应将文件或标准输入写入标准输出,并将字符替换为填充到下一个制表位所需的一个或多个字符。
expand
实用程序甚至会为您管理制表位,这似乎是您“对可见间距没有影响”要求的一部分,Perl单行可能不会(但是我敢打赌,这里有人可以提供一个单行程。)
答案 2 :(得分:6)
使用Text::Tabs。以下内容仅适用于文档:
perl -MText::Tabs -n -i.orig -e 'print expand $_' *
答案 3 :(得分:5)
perl -p -i -e 's/\t/ /g' file.txt
是实现此目的的一种方式
答案 4 :(得分:1)
$ perl -wp -i.backup -e 's/\t/ /g' *
答案 5 :(得分:0)
您可以使用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);