1

我有几行文件,我想将所有行与分隔符组合并删除最后一行。

它不适用于 perl。但使用 sed。你能帮助用perl完成这项工作吗?

 cat a
a
b
c
d

 cat a |perl -lane 'printf("%s|",$_)' |perl -lane 's/|$//;print'
a|b|c|d|

 cat a |perl -lane 'printf("%s|",$_)' |sed 's/|$//'
a|b|c|d
4

3 回答 3

5

为什么添加然后删除?

perl -pe'chomp; $_="|$_" if $. > 1; END { print "\n"; }'

顺便一提,

cat file | perl -e'...'   # Useless use of cat

可以写成

perl -e'...' <file

由于提供的所有解决方案都是从 ARGV 读取的,因此您甚至可以删除重定向并将文件名作为参数传递。

perl -e'...' file

为了好玩,打高尔夫球:

perl -pE'chomp;$.>1&&s/^/|/;END{say""}'  # Based on mine
perl -nlE'push@L,$_}{$"="|";say"@L"'     # Based on JRF's
perl -E'chomp(@L=<>);say join"|",@L'
perl -0777pe's/\n(?!\z)/|/g'

只有第一个不浪费内存。最后一个可能是最快的。

于 2012-10-02T22:36:15.747 回答
4

加入使这变得微不足道。你可以这样做:

cat a | perl -lne'push @lines,$_;END{print join "|", @lines}'

...但是你得到了无用的cat奖励,所以减少到:

perl -lne'push @lines,$_;END{print join "|", @lines}' a

a|b|c|d
于 2012-10-02T22:23:59.633 回答
2

尝试逃避它,

cat a |perl -lane 'printf("%s|",$_)' |perl -lane 's/\|$//;print'

Perl 将|其视为一种or搜索和替换。

于 2012-10-02T22:14:25.103 回答