可以在多条线上工作的Perl单线程?

时间:2012-05-15 07:20:08

标签: perl

我有一个文件,其中包含如下所示的成对行:

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

我需要输出:

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

我还需要在线路上做更多的正则表达式魔术。

这可以使用perl单行程完成吗?我的问题是使用-p将一次处理一行文件,而我需要一次处理两行。我的解决方案是首先运行另一个单行程序,删除文件中的所有换行符(我在不同的行对之间有另一个分隔符)但这看起来太麻烦了,我确信有更好的方法。

3 个答案:

答案 0 :(得分:0)

我无法帮助你more regexp magic而不知道它是什么,但这会将这些线组合为你的描述

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

答案 1 :(得分:0)

又一种方法:

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

答案 2 :(得分: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