好吧,简单的解决方案是将所有换行符和管道转换为制表符。这听起来有点疯狂,但乍一看,它确实像你想要的那样:
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