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