我有几行文件,我想将所有行与分隔符组合并删除最后一行。
它不适用于 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
我有几行文件,我想将所有行与分隔符组合并删除最后一行。
它不适用于 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
为什么添加然后删除?
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'
只有第一个不浪费内存。最后一个可能是最快的。
加入使这变得微不足道。你可以这样做:
cat a | perl -lne'push @lines,$_;END{print join "|", @lines}'
...但是你得到了无用的cat
奖励,所以减少到:
perl -lne'push @lines,$_;END{print join "|", @lines}' a
a|b|c|d
尝试逃避它,
cat a |perl -lane 'printf("%s|",$_)' |perl -lane 's/\|$//;print'
Perl 将|
其视为一种or
搜索和替换。