1

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

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

我需要输出这个:

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

我还需要对线路本身做更多的正则表达式魔术。

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

4

3 回答 3

0

在不知道它是什么的情况下,我无法为您提供帮助more regexp magic,但这将结合您所描述的线条

perl -lne 'print join "\t", $_, split /\|/, <ARGV>' myfile
于 2012-05-15T07:28:41.300 回答
0

还有一种方法:

perl -pe'$"="\t";chomp;$_="@{[$_,split q(\|),<>]}"'
于 2012-05-15T09:32:15.547 回答
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
于 2012-05-15T15:25:38.683 回答