특정 멀티바이트 범위를 제외하고 문자열에서 모든 문자를 제거합니다.

특정 멀티바이트 범위를 제외하고 문자열에서 모든 문자를 제거합니다.

sed또는 다른 도구를 사용하여 모든 문자를 제거하는 방법와는 별개로특정 멀티바이트 범위?

예를 들어 이 범위에는 \xd8\xa0 - \xd9\x8aUTF-8로 인코딩된 아랍어 문자가 포함됩니다. 다음은 sed를 사용한 순진하지만 희망적인 시도입니다.

$ echo "Peace be upon you. السلام عليكم. שלום עליכם. Paz sobre vosotros." | sed -n -e 's|[^\xd8\xa0-\xd9\x8a]||p'
sed: -e expression #1, char 25: Invalid range end

멀티바이트 문자를 이해하면 sed다음과 같은 문자열이 남습니다.

السلام عليكم

나는 iconv아랍어 특정 인코딩으로 변환을 사용하고 이를 사용한 sed다음 다시 변환하는 것에 대해 생각했습니다. 그러나 내가 하고 있는 일은 간단하지 않습니다. 예를 들어 아랍어와 히브리어를 유지하고 싶을 수도 있으므로 가능하면 항상 모든 것을 UTF-8로 유지하고 싶습니다.

sed멀티바이트 문자를 사용할 수 없는 경우 무엇을 사용해야 합니까? 나는 sed해결책을 찾고 있었지만 perl운이 없었습니다.

UTF-8질문에 라벨을 추가하려고 시도했지만 unix.SE가 Unicode라벨로 변경했습니다. 여기에는 유니코드가 없습니다. 이는 디스크에 저장된 인코딩된 문자열입니다. 별도의 라벨이 있어야 한다고 생각합니다 UTF-8.

답변1

당신은 그것을 사용할 수 있습니다유니코드 속성펄에서는:

echo "Peace be upon you. السلام عليكم. שלום עליכם. Paz sobre vosotros." \
| perl -CIO -pe 's/\P{Arabic}//g'
  • -CIOPerl에게 입력과 출력이 UTF-8로 인코딩되어 있음을 알려줍니다.
  • \P{...}부정적인 속성 일치는 \p{...}긍정적인 속성 일치가 됩니다.

답변2

사용행복하다(이전 Perl_6)

입력 예(한 줄 파일로 저장된 OP의 텍스트):

~$ cat peace.txt
Peace be upon you. السلام عليكم. שלום עליכם. Paz sobre vosotros.

아랍어 텍스트 추출:

~$ raku -ne 'put m:g/ <:Script<Arabic>>+ /;' peace.txt
السلام عليكم

히브리어 스크립트 추출:

~$ raku -ne 'put m:g/ <:Script<Hebrew>>+ /;' peace.txt
שלום עליכם

라틴어 텍스트 추출:

~$ raku -ne 'put m:g/ <:Script<Latin>>+ /;' peace.txt
Peace be upon you Paz sobre vosotros

Raku는 유니코드에 대한 고급 지원을 제공하며 Raku의 정규식 엔진은 강력한 "파서"로 개발되었습니다. 아래 링크를 참조하세요. 위의 코드는 일치하는 항목이 없으면 빈 줄을 반환합니다. 요소/행만 일치시키려면 $/일치 변수에 대한 조건부 호출을 추가 하면 됩니다 $<>.

~$ cat peace2.txt #(remove terminal period from each phrase)
Peace be upon you
السلام عليكم
שלום עליכם
Paz sobre vosotros

~$ raku -ne 'put m:g/ <:Script<Latin>>+ /;' peace2.txt
Peace be upon you


Paz sobre vosotros

~$ raku -ne 'put $/ if m:g/ <:Script<Latin>>+ /;' peace2.txt
Peace be upon you
Paz sobre vosotros

마지막으로 문자를 삽입하여 유니코드 속성의 부정을 검색할 수 있습니다 !. +원하는 문자 클래스를 사용하거나 추가하거나 뺄 수도 있습니다 -. [ :Z아래의 추가 정규식 원자(공백)에 유의하세요. 완전성을 위해 아래 코드는 +!매개변수를 보여줍니다. 단, -실제로는 작동할 수도 있습니다.]

~$ raku -ne 'put $/ if m:g/ <+:!Script<Latin> + :!Z >+ /' peace2.txt
السلام عليكم
שלום עליכם

https://docs.raku.org/언어/unicode
https://docs.raku.org/언어/unicode#index-entry-UTF-8_Clean-8
https://stackoverflow.com/a/66540269/7270649

관련 정보