Perl添加分隔符并删除最后一个

时间:2012-10-02 22:07:54

标签: perl

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

它不与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

3 个答案:

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

只有第一次浪费没有记忆。最后一个可能是最快的。

答案 1 :(得分:4)

join使这个变得微不足道。你可以这样做:

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

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

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

a|b|c|d

答案 2 :(得分:2)

尝试逃避它,

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

Perl在搜索和替换中将|视为or