2012-10-02 2 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()? say : print'' –

+0

@ikegam 여러 개의 oneliner 덕택에 더 많은 트릭을 배울 수 있습니다. – sfgroups

2

을 탈출 시도

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

펄 검색 및 바꾸기에 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

관련 문제