我有幾行文件,我想將所有行與分隔符合並並刪除最後一個。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
我有幾行文件,我想將所有行與分隔符合並並刪除最後一個。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
爲何增加那麼刪除?
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'[email protected],$_}{$"="|";say"@L"' # Based on JRF's
perl -E'chomp(@L=<>);say join"|",@L'
perl -0777pe's/\n(?!\z)/|/g'
只有第一沒有浪費內存。最後一個可能是最快的。
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
@ikegami感謝丟棄無用的'chomp' :-) – JRFerguson
請原諒所有更新。有一些有趣的打高爾夫球:) – ikegami
還有一個濫用'-l':'perl -l174 -nE'eof()?說:print'' –
@ikegam多謝oneliner,這有助於我學習更多的技巧。 – sfgroups