sed
または、他のツールを使用してすべての文字を削除する方法とは別に特定のマルチバイト範囲?
たとえば、この範囲には\xd8\xa0 - \xd9\x8a
UTF-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'
-CIO
Perl に入力と出力が 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