파일에서 ASCII가 아닌 UTF-8 문자를 모두 0으로 바꾸는 방법

파일에서 ASCII가 아닌 UTF-8 문자를 모두 0으로 바꾸는 방법

소스는 UTF-8 전용이라는 것입니다... ASCII 문자 집합(코드 포인트 U+0000 ~ U+007F)을 제외한 모든 UTF-8 문자는 다음 줄에 표시된 대로 0으로 바꿔야 합니다.

This is line 001122��33
this is second line ¿½1122ï

이는 다음으로 대체되어야 합니다.

This is line 0011220033
this is second line 00112200

이것은 수동으로 수행하는 데 사용하는 형식입니다.

grep -P "[^\x00-\x7F]" filename

답변1

Perl이 구출하러 옵니다!

perl -C -pe 's/[\x{80}-\x{ffffffff}]/0/g'
  • -p입력을 한 줄씩 읽고, 각 코드 줄을 실행하고 처리 후 인쇄합니다.
  • -CUTF-8 켜기

답변2

UTF-8 문자 집합을 사용하는 POSIX 호환 시스템 및 로케일에서는 다음을 수행할 수 있습니다.

tr -c '\0-\177' '[0*]' < file

그러나 적어도 GNU 구현은 tr아직 멀티바이트 문자를 지원하지 않기 때문에 이와 관련하여 호환되지 않습니다.

GNU 시스템에서는 awkGNU를 사용하여 이 작업을 수행할 수 있지만 최신 버전에서는 범위가 코드 포인트 기반입니다.

LC_ALL=C.UTF-8 gawk '{gsub(/[^\0-\177]/, "0"); printf "%s", $0 RT}' < file

답변3

다른 정보를 제공하지 않으셨으므로 귀하는 POSIX 사용자로 간주됩니다.

모든 POSIX 환경에서 작동해야 합니다. 왜냐하면 모든 작업은 POSIX 쉘의 POSIX 유틸리티를 통해 수행되기 때문입니다.

cat filename |
# each character to octal
od -A n -v -t o1 |
# remove blanks and make each line be '/^[0-7]..$/'
fold -sw3 | grep -v ' ' |
# if it is UTF-8 specific, then let it be 060: stands for "0"
# OBTW I referred RFC3629
# NOTE it does not care for broken characters.
sed '
  /^36/{$!N;$!N;$!N;s/^36..2...2...2../060/;}
  /^3[45]/{$!N;$!N;s/^3...2...2../060/;}
  /^3[0-3]/{$!N;s/^....2../060/;}' |
# insert \\ for xargs printf
sed 's/^/\\\\/' |
# buffering
# variable max is as in limits.h in POSIX, I think.
awk '
BEGIN{buffer="";max=4096-9;}
{
  if(length(buffer $0)<max)
    buffer=buffer $0;
  else{
    print buffer;
    buffer="";}}
END{
  if(buffer!="")
    print buffer;}' |
# finally
# NOTE that I have never tested if this would work if
# filename were empty, on every POSIX environment
# I have tested it only on GNU/Linux.
xargs -Ix printf x

다른 편리한 도구를 설치할 수 없더라도 당황하지 마십시오. 가지고 있는 도구를 사용해 보십시오.

관련 정보