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

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

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{...}肯定的な属性の一致になります。

おすすめ記事