programing

BOM을 사용하여 UTF-8 파일을 검색하는 우아한 방법?

yoursource 2022. 12. 11. 10:35
반응형

BOM을 사용하여 UTF-8 파일을 검색하는 우아한 방법?

디버깅을 위해 디렉토리에서 UTF-8 바이트 순서 마크(BOM)로 시작하는 모든 파일을 재귀적으로 검색해야 합니다.현재 솔루션은 단순한 셸 스크립트입니다.

find -type f |
while read file
do
    if [ "`head -c 3 -- "$file"`" == $'\xef\xbb\xbf' ]
    then
        echo "found BOM in: $file"
    fi
done

또는 짧고 읽을 수 없는 한 줄의 행이 필요한 경우:

find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done

줄 바꿈이 포함된 파일 이름에서는 작동하지 않지만 이러한 파일은 예상할 수 없습니다.

좀 더 짧거나 우아한 해결책은 없을까?

텍스트 에디터를 위한 흥미로운 텍스트 에디터 또는 매크로가 있습니까?

이 간단한 명령어 하나로 불량 BOM을 검출할 뿐만 아니라 클리어 할 수도 있습니다. : )

find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i {} \;

'찾기'가 너무 좋아요:)

경고 위의 세 문자가 포함된 이진 파일이 수정됩니다.

BOM 파일만 표시하려면 다음 명령을 사용합니다.

grep -rl $'\xEF\xBB\xBF' .

Windows에서 이를 수행하는 가장 쉽고 좋은 방법은 다음과 같습니다.

Total Commander → 프로젝트의 root dir로 이동 → find Altfiles ( + ) → file type *.* → Find text "EF BB BF" → Find 'Hex' 확인란 선택 → search

리스트가 표시됩니다.

find . -type f -print0 | xargs -0r awk '
    /^\xEF\xBB\xBF/ {print FILENAME}
    {nextfile}'

위에 제시된 솔루션의 대부분은 파일의 첫 번째 줄보다 더 많은 테스트를 수행하며, 일부(Marcus의 솔루션 등)가 결과를 필터링하는 경우에도 마찬가지입니다.이 솔루션은 각 파일의 첫 번째 줄만 테스트하기 때문에 조금 더 빠릅니다.

일부 false positive를 받아들인 경우(텍스트 이외의 파일이 있는 경우 또는 드물게 파일 중간에 ZWNBSP가 있는 경우), grep를 사용할 수 있습니다.

fgrep -rl `echo -ne '\xef\xbb\xbf'` .

사용할 수 있습니다.grepPerl을 찾아서 이렇게 제거하도록 하겠습니다.

grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'

다음과 같은 것을 사용합니다.

grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'

그러면 파일의 첫 번째 바이트부터 BOM이 발생합니다.

Windows 유저의 경우는, 이것을 참조해 주세요(PHP 스크립트는,BOM를 참조해 주세요).

이에 대한 과잉 해결 방법은 다음과 같습니다.vi같은 이름의 도구)를 사용하여 PHP 스크립트를 검색합니다.

phptags --warn ./

다음과 같이 출력됩니다.

./invalid.php: TRAILING whitespace ("?>\n")
./invalid.php: UTF-8 BOM alone ("\xEF\xBB\xBF")

그리고 그--whitespace모드는 이러한 문제를 자동으로 수정합니다(따라서 .discript만 다시 쓴다고 단언합니다).

JavaScript 파일만 수정하기 위해 사용하였습니다.

find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;
find -type f -print0 | xargs -0 grep -l `printf '^\xef\xbb\xbf'` | sed 's/^/found BOM in: /'
  • find -print0각 파일명 사이에 null\0을 입력합니다.
  • xargs -0행 구분 대신 늘 구분된 인수를 예상합니다.
  • grep -l에 regex와 일치하는 파일을 나타냅니다.
  • " " "^\xeff\xbb\xbf 이외의 UTF-8 에 제로 는, 그 것은 .OME이 아닌 UTF-8 파일에 행의 선두에 제로 폭의 공백이 있는 경우는, 그 파일과 일치하기 때문에, 완전히 올바른 것은 아닙니다.

UTF 파일을 찾는 경우 file 명령어가 작동합니다.파일의 인코딩이 무엇인지 알려줍니다.ASCII 이외의 문자가 포함되어 있는 경우는, UTF 가 표시됩니다.

file *.php | grep UTF

하지만 그것은 반복적으로 작동하지는 않을 것이다.재귀적으로 만들기 위해 몇 가지 고급 명령어를 만들 수 있지만, 저는 레벨이 떨어질 때까지 다음과 같이 각 레벨을 개별적으로 검색했습니다.

file */*.php | grep UTF

언급URL : https://stackoverflow.com/questions/204765/elegant-way-to-search-for-utf-8-files-with-bom

반응형