2012-07-20 7 views

答えて

15

Perlは[:ascii:]文字クラスをサポートしています。

perl -nle 'print if m{^[[:ascii:]]+$}' inputfile 
+0

ありがとうございます。これは完全に機能しました。 – Sudar

2

あなたは(必要に応じてより多くの句読点を含め)パターンに一致する行だけないを返し、パターンとして[^ a-zA-Z0-9.,;:-'"?!]のようなものを使用するegrep -vを使用することができます。

でも、それについて考えると、ダブルネゲート(-vと倒立文字クラス)はおそらくそれほど良くありません。別の方法は^[ a-zA-Z0-9.,;:-'"?!]*$です。あなたはまた、単にASCIIのためにフィルタリングすることができ

egrep -v "[^ -~]" foo.txt 
+0

私はすべての句読点を必要としています。だから、許可された文字のリストを指定するのではなく、ASCII以外のすべての文字を除外することは可能ですか? – Sudar

+1

おそらく主なポイントに接していますが、範囲[a-z]には一部のロケールでは非ASCII文字が含まれています。たとえば、私のシステムでは 'echoé| grep [a-z] 'が見つかりません。 – Anachrome

1

あなたはCロケールの使用を強制提供し、Awkのを使用することができます。

LC_CTYPE=C awk '! /[^[:alnum:][:space:][:punct:]]/' my_file 

環境変数LC_TYPE=C(またはLC_ALL=C)の文字分類のためのCロケールの使用を強制します。これは、文字クラス([:alnum:][:space:]など)の意味をASCII文字のみと一致するように変更します。

/[^[:alnum:][:space:][:punct:]]/正規表現マッチラインには、非ASCII文字を使用します。正規表現の前の!は条件を逆転させます。 ASCII以外の文字がない行だけが一致します。アクションが与えられていないので、行のマッチングにデフォルトアクションが使用されます(print)。

EDIT:これはまた、grepで実行することができます:Perl互換の正規表現をサポートしているのGNU grepのと

LC_CTYPE=C grep -v '[^[:alnum:][:space:][:punct:]]' my_file 
1

は、あなたが使用することができます。

grep -P '^[[:ascii:]]+$' file