vCard 행을 분할하는 방법

vCard 행을 분할하는 방법

관련된vCard 회선에 참여하는 방법, vCard는 이상한 줄 분할을 수행합니다.한 줄에 75자를 초과하는 경우 "CR, LF, 공백" 시퀀스를 삽입하세요.따라서 다음 줄은 다음과 같습니다.

123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J123456789K123456789L123456789M123456789N123456789O123456789P123456789Q123456789R123456789S123456789U123456789V123456789W123

다음 줄로 나누어야 합니다:

123456789A123456789B123456789C123456789D123456789E123456789F123456789G12345
 6789H123456789I123456789J123456789K123456789L123456789M123456789N123456789
 O123456789P123456789Q123456789R123456789S123456789U123456789V123456789W123

75자마다 줄 분할 시퀀스를 삽입할 수는 없습니다. 그러면 각 줄이 다시 75자보다 길어지기 때문입니다. 그리고 75자를 센 후에는 삽입할 수 없습니다. 왜냐하면 이는 줄이 다음과 같은 경우에만 발생하기 때문입니다.더 길게75자 이상. 한 가지 방법은 입력이 더 이상 변경되지 않을 때까지 다음 명령을 반복하는 것입니다.

sed -e 's/^\(.\{75\}\)\([^\r]\)/\1\r\n \2/' < file | sed -e '...' | ...

이것은 분명히 길고 불확실한 줄에는 작동하지 않으며 극도로 비효율적입니다. 이 대체물을 어떻게 만들겠습니까?

답변1

스크립트에 두 개의 명령을 추가하기만 하면 됩니다: ( P첫 번째 줄바꿈으로 인쇄) 및 D(첫 번째 줄바꿈으로 제거, 텍스트가 남아 있으면 반복).

sed -e '{ s/\(.\{75\}\)\(.\)/\1\n \2/; P; D }' file

답변2

이것은너무 좋지 않아문제를 해결해 보세요.

#!/usr/bin/awk -f

{
    if (length($0) > 76) {
        printf("%s\r\n ", substr($0, 1, 75));
        $0 = substr($0, 76);
        while (length($0) > 74) {
            printf("%s\r\n ", substr($0, 1, 74));
            $0 = substr($0, 75);
        }
    }
    print $0;
}

관련 정보