2011-05-13 65 views
6

我想寫一個Perl單行程序,它用空格替換當前目錄中一批文本文件中的所有制表符\ t',而不影響可見間距。用空格替換製表符的Perl程序

任何人都可以告訴我如何做到這一點?

回答

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); 
+5

+1:'perldoc -q標籤' – toolic 2011-05-13 20:48:53

5

perl -p -i -e 's/\t/ /g' file.txt將做到這一點

+0

你可能要超過一個在正則表達式的替換部分更多的空間,雖然 – 2011-05-13 20:35:22

+0

真 - 改變了它。 – kuriouscoder 2011-05-13 20:38:00

1
$ perl -wp -i.backup -e 's/\t/ /g' * 
12

你並不需要一個Perl的一個班輪這一種方式,你可以使用expand代替:

擴大工具應將文件或標準輸入寫入標準輸出,並將字符替換爲填充到下一個製表位所需的一個或多個字符。

expand工具甚至會採取管理標籤的保健站爲您和這似乎是你的「上可見的間距沒有影響」的要求,一個Perl的一個班輪或許我就不會一部分(但我在這裏打賭的人可以提供一個單線程)。

+3

這是好的**如果**你有一個*擴展*實用程序這樣做!我想你是在Unix世界:在Windows * expand.exe *做了一些完全不同的事情。 – AAT 2011-05-17 10:40:27

6

使用Text::Tabs。以下僅適用於非常輕微的文檔:

perl -MText::Tabs -n -i.orig -e 'print expand $_' * 
+0

謝謝!我對此進行了調整,以使文件標準化爲unix行尾,並消除尾部空白: 'perl -MText :: Tabs -ni -e's/\ s * $ //; s/\ s * \ r/\ n/g;打印擴展$ _,「\ n」'' – 2017-05-19 15:45:46

0

您可以使用s///來實現此目的。也許你有一個行存儲在$一行文字:

$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);