텍스트 파일에서 러시아어 및 아랍어 문자열을 제거하는 방법

텍스트 파일에서 러시아어 및 아랍어 문자열을 제거하는 방법

질문: 약 100만 줄의 텍스트 파일이 있는데 각 줄은 여러 단어로 구성되어 있고 일부 줄에는 러시아어 또는 아랍어 단어("잘못된 줄"이라고 함)가 포함되어 있는데 이러한 잘못된 줄을 삭제하고 싶습니다. 다른 모든 것은 "좋은 라인"입니다.

상황:

  • 일부 좋은 줄에는 비ASCII 문자가 포함되어 있으므로 비ASCII 문자를 모두 제거하는 것만으로는 문제가 해결되지 않습니다.
  • 모든 라인은 완전히 나쁘거나 완전히 좋기 때문에 실제로는 상황이 좀 더 쉬워집니다.

그래서 제가 생각해낸 해결책은 다음과 같습니다.

sort file.txt > sorted.txt

러시아어나 아랍어로 시작하는 모든 항목은 마지막에 나열됩니다. 그런 다음 시작하는 줄을 수동으로 확인한 다음 수행합니다.

head -n X sorted.txt > clean.txt

그들을 제거. 이를 수행하는 더 우아한 방법이 있습니까? 이 작업을 수행하는 데 사용할 수 있는 다른 Unix 도구는 무엇입니까?

입력 예:

kedi
cat
кошка
القط
candy
şeker
конфеты
كاندي
çağrı
resumé

원하는 출력:

kedi
cat
candy
şeker
çağrı
resumé

답변1

이것은 최소한 귀하의 예에서는 작동합니다.

$ perl -CS -Mutf8 -lne 's{ 
            (?= [\p{Arabic}\p{Cyrillic}] ) 
            [\p{Arabic}\p{Cyrillic}\p{Common}\p{Inherited}] + 
            (?<= [\p{Arabic}\p{Cyrillic}] ) }{}xg || print' < file

kedi
cat
candy
şeker
çağrı
resumé

기본 아이디어는 \p코드 포인트 세트(이 경우 아랍어 또는 키릴 문자)를 정의하는 것입니다. 라인이 일치하면 인쇄되지 않습니다. 불행하게도 나 자신도 자세한 내용을 이해하지 못합니다.@tchrist존재하다채팅. 거기에서 그의 설명을 읽어 보시기 바랍니다. 지금은 정규식을 해독할 시간이 없지만 직접 이해할 기회가 생기는 대로 설명을 추가하겠습니다. 소스를 보면 아래의 미니멀리스트 버전보다 더 완전하고 안전하다고 가정합니다.


내 이해의 단순화 된 버전은 다음과 같습니다.

$ perl  -CS -ne '/[\p{Arabic}\p{Cyrillic}]+/ || print' < file 

그러면 아랍어 또는 키릴 문자가 포함되지 않은 모든 줄이 인쇄됩니다.오직. STDIN, STDOUT 및 STDERR은 모두 유니코드입니다 -CS. perl-ne의미는 "각 입력 줄을 읽고 주어진 스크립트를 적용합니다 -e. 줄이 일치하지 않으면 /foo/ || bar작업을 수행한다는 의미입니다. 이 경우 줄이 아랍어 또는 키릴 문자와 일치하지 않으면 를 인쇄합니다.barfoo

마지막으로 \p{}이것은 (에서 man perluniprops):

   The Perl regular expression "\p{}" and "\P{}" constructs give access to
   most of the Unicode character properties. 

이를 통해 아랍어, 키릴 문자 또는 생각할 수 있는 거의 모든 문자와 같은 다양한 문자를 일치시킬 수 있습니다. 그러므로,캐릭터 클래스 [\p{foo}]스크립트의 모든 문자와 일치합니다 foo. 따라서 [\p{Arabic}\p{Cyrillic}]두 스크립트의 모든 문자가 일치됩니다.

관련 정보