저는 UNIX를 처음 접했고 Kirk McElhearn의 "Mac OS X Command Line"을 사용하여 몇 가지 명령을 스스로 배우고 있습니다.
일반 MS-Office Word 문서에서 텍스트 문자열을 검색할 수 있도록 tr
and 를 사용하려고 합니다 .grep
$ tr '\r' '\n' < target-file | grep search-string
하지만 반환되는 것은 다음과 같습니다.
Illegal byte sequence.
robomechanoid:Position-Paper-Final-Draft robertjralph$ tr '\r' '\n' < Position-Paper-Final-Version.docx | grep DeCSS
tr: Illegal byte sequence
robomechanoid:Position-Paper-Final-Draft robertjralph$
실제로 제가 만든 스크립트에서 동일한 줄을 실행했는데 vi
검색이 올바르게 수행되었습니다.
답변1
grep
텍스트 처리 도구입니다. 그들의 입력은 다음과 같을 것으로 예상됩니다.텍스트 파일. 이는 macOS에서도 마찬가지인 것으로 보입니다 tr
( tr
바이너리는 지원되어야 하지만).
컴퓨터는 데이터를 시퀀스로 저장합니다.바이트. 텍스트는 일련의 문자입니다. 문자를 바이트로 인코딩하는 방법에는 여러 가지가 있습니다.문자 인코딩. 전 세계 대부분(특히 OSX)의 사실상 표준 문자 인코딩은 다음과 같습니다.UTF-8, 이는 인코딩입니다.유니코드문자 집합. 가능한 바이트는 256개뿐이지만 가능한 유니코드 문자는 백만 개가 넘으므로 대부분의 문자는 다중 바이트로 인코딩됩니다. UTF-8은 가변 길이 인코딩입니다. 문자에 따라 문자를 인코딩하는 데 1~4바이트가 걸릴 수 있습니다. 일부 바이트 시퀀스는 UTF-8의 문자를 나타내지 않습니다. 따라서 일부 바이트 시퀀스는 유효한 UTF-8 텍스트 파일이 아닙니다.
tr
이러한 일련의 바이트를 발견했기 때문에 불평합니다. UTF-8로 인코딩된 텍스트 파일을 볼 것으로 예상했지만, 본 바이너리 데이터는 유효한 UTF-8이 아닙니다.
Microsoft Word 문서는 텍스트 파일이 아니라 워드 프로세싱 문서입니다. 워드 프로세싱 문서 형식은 텍스트뿐만 아니라 서식, 포함된 이미지 등도 인코딩합니다. 대부분의 워드 프로세싱 형식과 마찬가지로 Word 형식도 텍스트 파일이 아닙니다.
다음을 변경하여 텍스트 처리 도구에 바이트 작업을 지시할 수 있습니다.로케일. 특히 "C" 로케일을 선택하십시오. 이는 기본적으로 "특별하지 않음"을 의미합니다. 명령줄에서 다음을 사용하여 로케일 설정을 선택할 수 있습니다.환경 변수.
export LC_CTYPE=C
tr '\r' '\n' < target-file | grep search-string
이렇게 하면 오류가 발생하지 않지만 유용한 작업도 수행하지 않습니다. 왜냐하면 target-file
여전히 바이너리 파일이고 사용자가 지정한 대부분의 검색 문자열이 포함될 가능성이 낮기 때문입니다.
그건 그렇고, tr '\r' '\n'
이것은 Mac OS 9 또는 이전 버전에서 남겨진 텍스트 파일이 없으면 그다지 유용한 명령이 아닙니다. \r
(캐리지 리턴)은 Mac OS X 이전의 Mac OS에서 개행 구분 기호였습니다. OSX부터 개행 구분 기호는 \n
(개행, 유닉스 표준)이며 텍스트 파일에는 캐리지 리턴이 포함되지 않습니다. Windows는 두 문자 시퀀스 CR-LF를 사용하여 개행 문자를 나타냅니다. tr -d '\r'
Windows 텍스트 파일은 Unix/Linux/OSX 텍스트 파일로 변환됩니다.
그렇다면 명령줄에서 Word 문서를 어떻게 검색합니까? Word 문서 .docx
는 실제로압축된 아카이브여러 파일이 포함되어 있으며 기본 파일은 다음 위치에 있습니다.XML.
unzip -l Position-Paper-Final-Version.docx
Mac OS X에는 다음이 포함됩니다.zipgrepzip 파일 내부를 검색하는 유틸리티입니다.
zipgrep DeCSS Position-Paper-Final-Version.docx
docx 형식의 XML 파일은 대부분 하나의 큰 줄로 구성되므로 결과를 읽기가 쉽지 않습니다. 문서 본문 내에서 검색하려면 word/document.xml
아카이브에서 파일을 추출하세요. 파일에는 문서 텍스트 외에도 문서의 구조를 나타내는 XML 마크업도 포함되어 있습니다. 다음을 사용하여 XML 마크업을 약간 수정할 수 있습니다.sed
관리 가능한 행으로 나눕니다.
unzip -p Position-Paper-Final-Version.docx word/document.xml |
sed -e 's/></>\n</g' |
grep DeCSS
답변2
귀하의 로케일 문자 맵이 UTF-8인 것 같아서 바이너리에 문제가 있을 것입니다. C 로케일로 전환하세요.
LC_ALL=C tr '\r' '\n' < target-file | LC_ALL=C grep search-string