2012-10-01 3 views
4

여러 개의 문자를 작은 따옴표 나 큰 따옴표로 바꾸려고합니다. 큰 유니 코드 코드 포인트에서 일치하는 Perl 정규식

perl -Mutf8 -pi -e "s/[\x{2018}\x{201A}\x{201B}\x{FF07}\x{2019}\x{60}]/'/ug" test.txt 
perl -Mutf8 -pi -e 's/[\x{FF02}\x{201C}\x{201D}\x{201E}]/"/ug' text.txt 

만 백틱 문자

가 제대로 교체됩니다

# Replace all with double quotes 
" fullwidth 
“ left 
” right 
„ low 
" normal 

# Replace all with single quotes 
' normal 
‘ left 
’ right 
‚ low 
‛ reverse 
` backtick 

내가이 일을하려고 해요 ... :

여기 내 테스트 파일입니다. 나는 그것이 다른 코드 포인트가 너무 큰 것과 관련이 있다고 생각하지만, 이것에 대한 어떠한 문서도 찾을 수 없다.

여기에 one-liner은 유니 코드 코드 포인트를 덤프하여 정규식과 일치하는지 확인합니다.

$ awk -F\ '{print $1}' test.txt | \ 
    perl -C7 -ne 'for(split(//)){print sprintf("U+%04X", ord)." ".$_."\n"}' 

U+FF02 " 
U+201C “ 
U+201D ” 
U+201E „ 
U+0022 " 

U+0027 ' 
U+2018 ‘ 
U+2019 ’ 
U+201A ‚ 
U+201B ‛ 
U+0060 ` 

정규식이 일치하지 않는 이유는 무엇입니까?

답변

16

Perl 로의 호출에서 -CSAD을 잊어 버렸기 때문에 일치하지 않습니다. 사용자 환경에 $PERL_UNICODE이 설정되어 있지 않습니다. 소스 코드가 해당 인코딩에 있음을 알리기 위해서만 -Mutf8이라고 말했습니다. 이것은 입출력에 영향을주지 않습니다.

당신이 필요합니다

$ perl -CSAD -pi.orig -e "s/[\x{2018}\x{201A}\x{201B}\x{FF07}\x{2019}\x{60}]/'/g" test.txt 

나는 this answer 몇 번에 이런 종류의 물건을 언급 할.

+0

감사합니다. –

+0

@ tchrist, -CSAD를 -CSD로 대체하여 답을 수정하십시오. 나는 그렇게 할 수있는 편집 권한이 없습니다. –

+0

@ HansDeragon 완료. – tchrist

6

use utf8;을 사용하면 Perl에 소스 코드가 UTF-8이라고 말했을 것입니다. 이것은 소스 코드를 ASCII로 제한했기 때문에 무해합니다.

/u으로 유니 코드 정의를 \s, \d, \w으로 지정했다. 이러한 패턴을 사용하지 않으므로이 방법은 쓸모가 없습니다 (무해하지만).

입력 내용을 디코딩하지 않았으므로 입력 내용이 바이트로만 구성되므로 클래스의 대부분의 문자 (예 : \x{2018})는 아무 것도 일치하지 않을 수 있습니다. 당신은 당신의 입력을 해독 할 필요가있다. -CSD을 사용하면이 작업을 수행 할 가능성이 큽니다.

perl -CSD -i -pe' 
    s/[\x{2018}\x{201A}\x{201B}\x{FF07}\x{2019}\x{60}]/\x27/g; 
    s/[\x{FF02}\x{201C}\x{201D}\x{201E}]/"/g; 
' text.txt 
+0

쉘에서 물건을 인용하는 방법을 알아야하는 것을 싫어합니다. 나는 보통'\ x27 '트릭을 선택한다. – tchrist

+0

방금'''''''''생각하지 않고, 구매하고,''''\ x27'은 좋은 생각입니다. – ikegami

+0

당신이 "당신을 해독 할 필요가 있습니다 ** 입력 **"라고 생각하고 아마 또한 "출력을 인코딩해야합니다"라고 생각합니다. – tchrist

관련 문제