vCard 회선에 참여하는 방법

vCard 회선에 참여하는 방법

vCard는 긴 줄을 분할하는 특별한 방법을 사용합니다. 75자에 DOS 개행 문자가 삽입됩니다.그리고공간. 그래서 합류한다는 뜻은"CR, LF, Space" 시퀀스의 모든 항목을 빈 문자열로 바꿉니다.그렇지 않으면 파일을 그대로 두십시오. 지금까지 내가 찾은 가장 쉬운 방법 (사용sed여러 줄 검색 및 바꾸기) 이것은:

sed -n '1h;1!H;${;g;s/\r\n //g;p;}' contacts.vcf

이것은 읽기가 꽤 어렵습니다. 더 쉬운 방법이 있나요?

편집하다:구현 결과기반으로Peter.O의 답변.

답변1

업데이트: 이 awk스크립트는 귀하의 요구 사항에 더 적합할 수 있습니다.

awk -vRS='\r\n ' -vORS= 1 contacts.vcf 

(원래 게시물)
스크립트 perl는 작동하지만 실제로는 더 길고 sed조금 더 떨어져 있더라도 논리적으로는 sed. perl파일을 메모리로 읽는 것이 더 빠를 수도 있습니다(?).그렇습니까, 아니면 첫 번째 줄이 아닙니까?다루다...

  perl -e 'undef $/; $_=<>; s/\r\n //g; print' contacts.vcf 
#          |         |      |           |
#          ignore    get    substitute  print
#          newlines  all    as needed   result
#          |         |      |           |
# sed -n '1h; 1!H; ${g;     s/\r\n //g; p}' contacts.vcf  

반면에 농담이 아닙니다. 하지만 sed 스크립트를 쉽게 읽을 수 없고 작동한다면 그냥 읽을 수 있도록 만드세요. 나는 그런 sed 스크립트를 읽을 수 없습니다! Single Line Syndrome은 단순한 교체 이상의 sed 스크립팅에 적합하지 않습니다. sed고급 스크립팅 언어라기보다는 텍스트 어셈블리 언어에 가깝습니다. perl또한 다소 난해하지만 간결한 구문으로 작동하는 경향이 있습니다.

sed -n '
    1h            # if 1st line, copy the pattern space to the hold space
    1!H           # if NOT 1st line, append the pattern to the hold space
    ${            # if this is the last line
      g           # overwrite current pattern with accumulated patterns from hold space
      s/\r\n //g  # make required substitutions
      p           # print the final result. 
    }' contacts.vcf

관련 정보