sed가 추가 줄 바꿈을 추가하는 것을 중지하는 방법

sed가 추가 줄 바꿈을 추가하는 것을 중지하는 방법

다음 2개의 명령을 실행하고 있습니다 sed. 첫 번째는 내가 원하는 곳에 개행을 추가하고, 두 번째도 내가 원하는 곳에 개행을 추가하지만, 이전에 개행이 없었던 파일 끝에 추가 개행을 추가합니다.

sed -e 's|\<LIST_G_STATEMENT>|&\
|g' ${XMLDIR}/statement_tmp_1.xml > ${XMLDIR}/statement_tmp_2.xml

sed -e 's|\</LIST_G_STATEMENT>|&\
|g' ${XMLDIR}/statement_tmp_2.xml > ${XMLDIR}/statement_tmp_3.xml

od -c이를 3개 파일 모두에 사용하면 다음과 같은 출력이 생성됩니다.

comments_tmp_1.xml ( \n파일 끝에 없음)

1314700    T   A   T   E   M   E   N   T   >   <   /   L   I   S   T   _
1314720    G   _   S   T   A   T   E   M   E   N   T   >   <   /   G   _
1314740    S   E   T   U   P   >   <   /   L   I   S   T   _   G   _   S
1314760    E   T   U   P   >   <   /   A   R   X   S   G   P   O   >
1314777

comments_tmp_2.xml ( \n파일 끝에 없음)

1314700    S   T   A   T   E   M   E   N   T   >   <   /   L   I   S   T
1314720    _   G   _   S   T   A   T   E   M   E   N   T   >   <   /   G
1314740    _   S   E   T   U   P   >   <   /   L   I   S   T   _   G   _
1314760    S   E   T   U   P   >   <   /   A   R   X   S   G   P   O   >
1315000

comments_tmp_3.xml ( \n파일 끝 - 어디서 왔는가?)

1314700    S   T   A   T   E   M   E   N   T   >   <   /   L   I   S   T
1314720    _   G   _   S   T   A   T   E   M   E   N   T   >  \n   <   /
1314740    G   _   S   E   T   U   P   >   <   /   L   I   S   T   _   G
1314760    _   S   E   T   U   P   >   <   /   A   R   X   S   G   P   O
1315000    >  \n
1315002

저는 AIX 5.3을 사용하고 있습니다.

기본적으로 extra 추가를 중단 \n하거나 제거하는 방법을 찾고 싶습니다.

답변1

운이 좋다고 생각해야 합니다. AIX는 sed누락된 개행 문자를 추가합니다.

줄 바꿈으로 끝나지 않는 비어 있지 않은 파일은 (적어도 텍스트 파일의 POSIX 정의에 따르면) 텍스트 파일이 아닙니다. 줄 바꿈으로 끝나는 문자이므로 텍스트가 실용적입니다. 프로그램의 동작(예: sed위와 같은)은 지정되지 않으며 실제로 구현마다 다릅니다.

일부 sed구현에서는 마지막 줄 뒤의 가짜 문자를 무시합니다.

AFAIK, xml파일은 텍스트 파일이어야 하므로 sed방금 수정되었음을 의미합니다.

파일이 줄바꿈으로 끝나지 않도록 해야 한다면 perl텍스트가 아닌 데이터를 처리할 수 있는 다른 도구를 사용할 수 있습니다.

perl -pe 's|<LIST_G_STATEMENT>|$&\n|g'

답변2

다음을 사용하여 파일에서 마지막 개행 문자를 제거하는 방법은 다음과 같습니다 dd.

printf "" | dd  of='/path/to/file' seek=<filesize_in_bytes - 1> bs=1 count=1

파일이 개행 문자로 끝나는지 테스트하려면 다음을 사용할 수 있습니다.

tail -c 1 /path/to/file | tr -dc '\n' | wc -c

파일 크기를 바이트 단위로 얻으려면 다음을 사용하십시오.

wc -c < /path/to/file

답변3

이에 따르면AIX 매뉴얼IBM은 tail그렇습니다 -r. 멋져 보입니다. 파일이 20KB보다 작으면 다음이 작동합니다.

tail -r <file | dd bs=1 skip=1 | tail -r >file.new

관련 정보