2011-12-12 2 views

답변

1
perl -l -00 -aF/\s*\n\s*/ -ne 'print "@F"' /source/file > /dest/file 

설명

  • -l : 자동 씹는 기록과는 say 같은 print 행동을합니다.
  • -00 :는 "단락 모드"로 펄을두고 있으며 연속 찾습니다 "\ n \ n"
  • -a : 필드 배열에 자동 분할 기록 @F
  • -F : 다음 패턴을 사용하여 자동 분할을 사용하여 레코드를 분할하십시오.
  • -ne :는 ("\ n을 \ 없음"으로 구분) 각 레코드에 대해 다음을 실행
  • 당신의 그룹 "단락"그래서 등을 읽을 것을 표시
+0

으로 줄 바꿈과 긴 명령 행은 좋은 것 아니다 읽을 수있는 스크립트를 인쇄 다음

perl -i.bak -lpwe 'BEGIN { $/="" }; s/\n/ /g' input.txt 

:) –

+0

'-l'은 chomps 입력뿐만 아니라'print'에 개행 문자를 추가합니다. 또한'-a'와'-F'를 체크 아웃 할 수도 있습니다. ;) – TLP

+0

@TLP, 나는'-l'을 많이 사용하지 않습니다. 감사합니다. – Axeman

1

말했을 때 만 인쇄; 공백에 단어를 나눕니다. 그 결과를 하나의 공간 (공백)를 사용하여 다시 가입 인쇄 :

#!/usr/bin/env perl 
use strict; 
use warnings; 
local $/ = ''; 
my @words; 
while (<DATA>) { 
    @words = split; 
    print join q(), @words, "\n"; 
    @words =(); 
} 
__DATA__ 
word1 
word2 
word3 
word4 

word5 
word6 
word7 
word8 

word9 
word10 
word11 
word12 
+0

공백을 포함하는 행에는 작동하지 않습니다. 예 : "word1 word2 \ n ...". – TLP

+0

글쎄, * 작동 할 것이지만 공백을 공백으로 대체 할 것이고 특히'\ n'에 더 잘 분할하는 것이 더 좋다. – TLP

+0

Fantastci! 위대한 – user1094066

2
perl -i.bak -pwe 's/\S\s*\K\n$/ /' input.txt 
  • -i.bakinput.txt.bak
  • -p에 백업을 저장하는 스크립트 주위에 잠시 (<>) 루프를두고
  • 정규 표현식은 공백 문자가 아닌 공백 문자 으로 끝나는 라인을 찾고 공백 문자 다음에 개행 문자를 추가하고 개행 문자를 공백으로 대체합니다. \K 탈출은 "이것보다 먼저 모든 것을 보관하십시오"를 의미합니다.

또 다른 옵션은 다음 BEGIN 블록에 단락 모드를 사용하고, 각각 -l

+0

나는'\ K' 플래그가 처음으로 보이는 것을 본다. 이것은 가변 길이 lookbehind의 필요성을 배제합니다. – Zaid

+1

@Zaid 그것은 lookbehind와 같은 장소에서 언급됩니다. http://perldoc.perl.org/perlre.html#Look-Around-Assertions – TLP

+0

Nice. Perl의 많은 기능과 마찬가지로이 작은 덩어리는 매우 유용합니다. – Zaid

관련 문제