好了,簡單解決方案是將所有換行符和管道變成標籤。這聽起來有點瘋狂,但乍一看,它聽起來像是你想要什麼:
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
來源
2012-05-15 15:25:38
TLP
爲什麼你堅持一行Perl程序? – Borodin
我不堅持 - 最終我用多條線做了它。但是,根據我的經驗,在Perl中,一件襯衫具有驚人的力量,所以也許我只是缺少一些基本的東西。 –