소스는 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
입력을 한 줄씩 읽고, 각 코드 줄을 실행하고 처리 후 인쇄합니다.-C
UTF-8 켜기
답변2
UTF-8 문자 집합을 사용하는 POSIX 호환 시스템 및 로케일에서는 다음을 수행할 수 있습니다.
tr -c '\0-\177' '[0*]' < file
그러나 적어도 GNU 구현은 tr
아직 멀티바이트 문자를 지원하지 않기 때문에 이와 관련하여 호환되지 않습니다.
GNU 시스템에서는 awk
GNU를 사용하여 이 작업을 수행할 수 있지만 최신 버전에서는 범위가 코드 포인트 기반입니다.
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
다른 편리한 도구를 설치할 수 없더라도 당황하지 마십시오. 가지고 있는 도구를 사용해 보십시오.