我有几行文件,我希望将所有行与分隔符组合并删除最后一行。
它不与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
答案 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
。