特定のマルチバイト範囲を除いて、文字列からすべての文字を削除します。

特定のマルチバイト範囲を除いて、文字列からすべての文字を削除します。

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ラベルに変更しました。ここにはUnicodeはありません。これはディスクに保存されているエンコードされた文字列です。別々のラベルがあると思いますUTF-8

答え1

あなたはそれを使用することができますUnicodeプロパティパールでは:

echo "Peace be upon you. السلام عليكم. שלום עליכם. Paz sobre vosotros." \
| perl -CIO -pe 's/\P{Arabic}//g'
  • -CIOPerl に入力と出力が UTF-8 でエンコードされていることを伝えます。
  • \P{...}否定的な属性の一致は\p{...}肯定的な属性の一致になります。

答え2

使用幸せ(以前のPerl_6)

入力例(1行ファイルとして保存された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はUnicodeの高度なサポートを提供し、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

最後に、文字を挿入してUnicodeプロパティの否定を取得できます!+必要な文字クラスを使用、追加、または減算することもできます-[: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

関連情報