관련된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;
}