2012-05-15 186 views
1

我有一個包含行的對,是這樣的一個文件:Perl可以在多行上運行嗎?

FIRST PIECE OF INFO 
PIECE 2 | PIECE 3 | PIECE 4 | ... 

我需要輸出這樣的:

FIRST PIECE OF INFO\tPIECE 2\tPIECE 3 ... 

的我還需要做上線本身一些正則表達式魔術。

這可以使用perl單線程完成嗎?我的問題在於使用-p會一次處理一行文件,而我一次需要處理兩行文件。我的解決方案是首先運行另一個單行程式,從文件中刪除所有換行符(我在不同的行對之間有另一個分隔符),但這看起來太麻煩了,我相信有更好的方法。

+0

爲什麼你堅持一行Perl程序? – Borodin

+0

我不堅持 - 最終我用多條線做了它。但是,根據我的經驗,在Perl中,一件襯衫具有驚人的力量,所以也許我只是缺少一些基本的東西。 –

回答

0

好了,簡單解決方案是將所有換行符和管道變成標籤。這聽起來有點瘋狂,但乍一看,它聽起來像是你想要什麼:

perl -pwe 'tr/\n|/\t\t/' yourfile.txt 

但有一些不與你的問題的描述相匹配。你說:

我有一個包含對

一個文件,這將意味着你的文件實際上看起來是這樣的:

FIRST PIECE OF INFO 
PIECE 2 | PIECE 3 | PIECE 4 | ... 
SECOND PIECE OF INFO 
PIECE 2a | PIECE 3b | PIECE 4b | ... 
THIRD... etc 

在這種情況下,盲目地轉換新行會將所有內容放在一條線上。現在,我的這個解釋是,你想要的是像這樣(字面上表示製表符和換行符):

FIRST PIECE OF INFO\tPIECE 2\tPIECE 3\tPIECE 4 | ...\n 
SECOND PIECE OF INFO\tPIECE 2a\tPIECE 3b\tPIECE 4b | ...\n 

這不是一個簡單的音譯實現。

perl -plwe 'next if !/\S/; $_ = join "\t", $_, split /\s*\|\s*/,<>;' file.txt 

注:next if !/\S/;語句是隻以防止流被暫停在萬一該文件包含一個奇數行的端部。如果是這樣,文件句柄<>將嘗試從STDIN讀取,並且您將需要按Ctrl-D手動停止它。

Data::Dumper輸出看起來是這樣的,有$Data::Dumper::Useqq = 1顯示空白字符:

$VAR1 = "FIRST PIECE OF INFO\tPIECE 2\tPIECE 3\tPIECE 4\t...\n"; 
$VAR1 = "SECOND PIECE OF INFO\tPIECE 2a\tPIECE 3b\tPIECE 4b\t...\n"; 

的一個襯爲上面的輸出是這樣的,有點改寫:

perl -MData::Dumper -nlwe ' 
    $Data::Dumper::Useqq=1; 
    next if !/\S/; 
    $_ = join "\t", $_, split /\s*\|\s*/,<>; 
    print Dumper $_;' file.txt 
0

我不能幫你與more regexp magic不知道它是什麼,但是這將線條組合成你的描述

perl -lne 'print join "\t", $_, split /\|/, <ARGV>' myfile 
+0

「更多正則表達式魔術」僅僅意味着我對線條做了其他更改。 –

+0

我意識到這一點,但我無法將這些更改整合到我的解決方案中,而無法理解它們是什麼。 – Borodin

0

另一種方法:

perl -pe'$"="\t";chomp;$_="@{[$_,split q(\|),<>]}"'