이탈리아어와 중국어로 작성된 텍스트로 작업하고 있는데 AWK
. 어떻게 해야 하나요?
나는 시도했다:
4E00 thru 9FFF (344 270 200 thru 351 277 277)
[ 테스트에 필요한 중국어 유니코드 문자 범위 >"\343" and <"\352"
(4자 UTF-8 코드 선택을 방지하기 위해)]:
{
f=0;
for ( i=1; i<=length; i++)
if(substr($0, i, 1)>"\343" &&substr($0, i, 1)<"\352")
f = 1
print $f
}
하지만 오류 이상이 있습니다. 찾을 수 없어요
답변1
문제는 UTF-8 문자 스트림의 원시 바이트를 필터링하면 UTF-8 파일에서 유니코드 시퀀스의 일부를 먹게 되어 잘못된 바이트 시퀀스가 발생한다는 것입니다. 그건 작동하지 않습니다. 대신, UTF-8을 이해하고 (원시 바이트가 아닌) 유니코드 데이터에 필터를 적용하는 도구를 사용해야 합니다.
awk
어떤 구현을 사용하고 있는지 모르기 때문에 유니코드를 지원하는지 알 수 없습니다. 그러나 나는 Perl이 완전히 유니코드 안전하다는 것을 알고 있으므로 다음 Perl 한 줄짜리 코드가 작동해야 합니다.
perl -CS -p -e 's/[^\s\p{Han}]//g'
\s
나는 당신이 보고 싶어할 것이라고 가정합니다 . 이 \p{Han}
비트는 유니코드로 선언된 문자가 한자(즉, 한자)에 사용되는 것과 일치시키길 원한다는 것을 Perl에게 알려줍니다. 해당 범위에 포함되지 않은 구두점이 필요한지 모르겠습니다. 그렇다면 구두점도 추가해야 할 수도 있습니다.
그런 다음 범위를 선행 범위로 부정 ^
하고 마지막으로 전역 대체 명령( s///g
)에서 이를 인코딩하여 Perl에게 첫 번째 슬래시 뒤의 부분 인스턴스(부정된 범위 또는 "이 범위에 없는 모든 항목")를 다음으로 대체하도록 지시합니다. 두 번째 이후와 세 번째 이전의 부분(즉, 없음).
여러 범위를 포함할 필요가 없는 경우 [^]
구성을 중단하고 동일한 일치 반전을 수행하는 \P
not 사용으로 전환할 수 있습니다.\p
남은 것은 우리가 입력한 문자 범위(한자의 유니코드 문자와 공백)입니다.
자세한 내용은 다음을 참조하세요.perldoc perlre
Perl이 정규 표현식을 처리하는 방법에 대한 설명perldoc perluniprops
\p{}
가능한 유니코드 속성( 또는 구문 에 배치할 수 있는 비트) 목록입니다 \P{}
.
답변2
이것을 사용하면 awk
다음을 수행할 수 있습니다.
awk '{for(i=1; i<=length;i++) if(substr($0,i,1)>="\xS_INDEX" && substr($0,i,1)<="\xE_INDEX"){printf substr($0,i,1);f=1;} if(f)printf "\n"; f=0}' filename
.ascii 의 시작 및 끝 인덱스는 다음 S_INDEX
과 같습니다 .E_INDEX
hex
입력의 경우:
1243
135
dgfsdaa
125
sdg124
sdf34
숫자만 선택: S_INDEX = 30 및 E_INDEX = 39
산출:
1243
135
125
124
34