1

数行のファイルがあります。すべての行を区切り記号で結合し、最後の行を削除します。

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
4

3 に答える 3

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'

最初のものだけがメモリを浪費しません。最後のものがおそらく最速です。

于 2012-10-02T22:36:15.747 に答える
4

参加すると、これは簡単になります。あなたができること:

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

...しかし、あなたは役に立たないcat賞を獲得するので、それを次のように減らします:

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

a|b|c|d
于 2012-10-02T22:23:59.633 に答える
2

逃げてみて、

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

Perl は を検索置換と見なし|ますor

于 2012-10-02T22:14:25.103 に答える