2012-10-02 82 views
1

我有幾行文件,我想將所有行與分隔符合並並刪除最後一個。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 

回答

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'[email protected],$_}{$"="|";say"@L"'  # Based on JRF's 
perl -E'chomp(@L=<>);say join"|",@L' 
perl -0777pe's/\n(?!\z)/|/g' 

只有第一沒有浪費內存。最後一個可能是最快的。

+0

請原諒所有更新。有一些有趣的打高爾夫球:) – ikegami

+1

還有一個濫用'-l':'perl -l174 -nE'eof()?說:print'' –

+0

@ikegam多謝oneliner,這有助於我學習更多的技巧。 – sfgroups

2

嘗試逃離它,

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

Perl中看到|or在搜索和替換。

+0

作爲說明,其他解決方案使原始語句更具可讀性。 – squiguy

+0

不錯,爲什麼它沒有刪除最後一個 – sfgroups

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 
+0

@ikegami感謝丟棄無用的'chomp' :-) – JRFerguson

相關問題