
イタリア語と中国語で書かれたテキストで作業していますAWK
。どうすればいいですか?
私は試した:
4E00 thru 9FFF (344 270 200 thru 351 277 277)
[テストに必要な中国語のUnicode文字範囲>"\343" and <"\352"
(4文字UTF-8コードの選択を防ぐため)]:
{
f=0;
for ( i=1; i<=length; i++)
if(substr($0, i, 1)>"\343" &&substr($0, i, 1)<"\352")
f = 1
print $f
}
しかし、エラー以上があります。見つかりません。
答え1
問題は、UTF-8文字ストリームの生のバイトをフィルタリングすると、UTF-8ファイルからUnicodeシーケンスの一部を食べることになり、無効なバイトシーケンスが発生することです。それは動作しません。代わりに、UTF-8を理解し(ネイティブバイトではなく)Unicodeデータにフィルタを適用するツールを使用する必要があります。
awk
どの実装を使用しているかわからないので、Unicodeをサポートしているかどうかはわかりません。しかし、私はPerlが完全にUnicodeで安全であることを知っているので、次のPerlの1行コードが機能するはずです。
perl -CS -p -e 's/[^\s\p{Han}]//g'
\s
私はあなたが見たいと思うと仮定します。この\p{Han}
ビットは、Unicodeで宣言された文字が漢字(つまり漢字)に使用されるものと一致させたいことをPerlに伝えます。その範囲に含まれていない句読点が必要かどうかわかりません。その場合、句読点も追加する必要があります。
次に、範囲を前の範囲に否定し、最後にグローバル置換コマンド^
(s///g
)でそれをエンコードして、Perlに最初のスラッシュの後の部分インスタンス(否定された範囲または「この範囲にないすべての項目」)を次に置き換えるように指示します。 。 2番目と3番目の前の部分(つまりなし)。
複数の範囲を含める必要がない場合は、[^]
構成を中断して同じ一致反転を実行する\P
not使用に切り替えることができます。\p
残りは、私たちが入力した文字範囲(漢字のUnicode文字とスペース)です。
詳細については、次を参照してください。perldoc perlre
Perlが正規表現を処理する方法の説明perldoc perluniprops
\p{}
可能なUnicode属性(または構文に配置できるビット)のリスト\P{}
。
答え2
これにより、awk
次のことができます。
awk '{for(i=1; i<=length;i++) if(substr($0,i,1)>="\xS_INDEX" && substr($0,i,1)<="\xE_INDEX"){printf substr($0,i,1);f=1;} if(f)printf "\n"; f=0}' filename
.asciiの開始インデックスと終了インデックスは次S_INDEX
のとおりです。E_INDEX
hex
入力の場合:
1243
135
dgfsdaa
125
sdg124
sdf34
数値のみを選択: S_INDEX = 30 および E_INDEX = 39
出力:
1243
135
125
124
34