줄 바꿈 문자를 추가하지 않도록 sed를 중지하는 방법


17

다음 두 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세 파일 모두에서 사용 하면 다음과 같은 결과가 출력됩니다.

statement_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

statement_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

statement_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을 실행 중입니다.

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


그냥 질문 : 왜 당신도 s|...|&\n|마찬가지로 사용할 수있을 때 대체 패턴에 리터럴 개행 문자를 사용하고 있습니까?
Joseph R.

1
@JosephR. \n오른쪽에 휴대용이 아닙니다.
Stéphane Chazelas

@StephaneChazelas 이상합니다. CR 대 CRLF입니까?
Joseph R.

2
개행 문자로 끝나지 않는 파일은 텍스트 파일이 아니므로 텍스트 유틸리티가있는 동작은 지정되지 않습니다 . perl이진 데이터를 처리 할 수있는 다른 도구를 사용하십시오 .
Stéphane Chazelas

4
@JosephR. 아니요, \<LF>LF 문자를 추가하는 전통적인 POSIX 방식입니다. \n일반적으로 nGNU 이외 의 문자를 대체합니다 sed.
Stéphane Chazelas

답변:


10

AIX sed에서 누락 된 줄 바꿈 문자를 추가 한 것은 운이 좋을 것입니다 .

줄 바꿈 문자로 끝나지 않은 비어 있지 않은 파일은 텍스트 파일이 아니고 텍스트 파일은 POSIX 정의에 따라 최소한 텍스트 파일의 POSIX 정의에 따라 행을 포함하고 행은 long) 줄 바꿈 문자로 끝나는 일련의 문자이므로 텍스트 유틸리티의 동작 sed은 지정되지 않으며 실제로 구현마다 다릅니다.

일부 sed구현은 마지막 행 다음에 그 가짜 문자를 무시했을 것입니다.

AFAIK, xml파일은 텍스트 파일을 의미하므로 sed수정되었습니다.

해당 파일이 개행 문자로 끝나지 않아야하는 경우 perl텍스트가 아닌 데이터를 처리 할 수있는 도구 나 다른 도구를 사용할 수 있습니다.

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

1
출력을 다른 표준 Unix 유틸리티로 파이프하려는 경우 종료 줄 바꿈 도움 이됩니다 sed. 솔직히 말해서 Bourne 쉘 명령 대체 가 최종 개행 문자가있는 경우 몰래 다듬기 때문에 수년 동안sed 이 사실을 알지 못했습니다 . 그러나이 있다 당신은 확실히 그것을 원하지 않는 시간; 예를 들어 ,와 X 클립 보드의 텍스트를 조작 . 참고로 GNU sed는 사용 가능한 경우이 SE answer에 설명 된대로 옵션 과 함께 사용하면 종료 줄 바꿈을 추가하지 않습니다 . $(sed 's/bas/replac/' <<<'basement')sedp-n
TheDudeAbides

0

다음을 사용하여 파일에서 최종 개행을 제거하는 방법은 다음과 같습니다 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

0

이에 따라 AIX 매뉴얼 IBM의는 tail않습니다 -rEVERSE - 정말 멋진 보이는한다. 파일이 20KB 미만이면 다음이 작동합니다.

tail -r <file | dd bs=1 skip=1 | tail -r >file.new
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.