2016-04-10 18 views
0

私は古いDOS時代のワードプロセッサを使って90年代に生成されたいくつかの古いテキストデータファイルを持っています。当時の制限により、データ入力プロセス中に「単純化された」エントリが多数あります。特殊文字に似た文字を検索

たとえば、「Náufragos」という単語が「Naufragos」と入力されました。

ここで、上記のデータファイルで "Náufragos"を検索すると、grepを使って "Náufragos"を検索して検索が空になりますが、 "Naufragos" 。

私はgrepのドキュメントを梳き、広範囲にグーグルで行ったが、空になってしまった。

すべての解決方法は、ラテンアルファベットのベースの(つまり、古いデータファイルに中国語、キリル文字、日本語などはありません) 。

これにはgrepまたはおそらくperlオプションがありますか?おそらく何かのように:

grep -<magic option> Náufragos file.txt 
+0

このPerlモジュールを見てください:http://search.cpan.org/~bkb/Text-Fuzzy-0.24/lib/Text/Fuzzy.pod。単語を比較して「類似性指標」を返すことができます。あなたのサンプルワードについては、単一の文字が変更されるので、インデックスは "1"に等しくなければなりません。 – bart

+0

http://stackoverflow.com/q/11058211/1030675 – choroba

答えて

0

あなたはいつもそれが迷惑である場合に述べたように、Text::Unidecodeを使用してスクリプトを名前のスペル、およびいずれかに一致するように、文字の範囲、例えば、

grep -i 'N[aá]ufragos' * 

を使用してgrepすることができますHow to convert letters with accents, umlauts, etc to their ASCII counterparts in Perl?は範囲式を生成することができます(ISO-8859-1の数文字には分音記号が付いている可能性が高いためです)。

Text::Unidecodeの欠点の1つは、システムにプリインストールされている可能性が低いことです(たとえば、Debianではパッケージがありません)。 cpanminusなど、CPANから直接取得します。しかし、より良いスクリプトはそれ以来の古い/新しい名前の両方に一致します

​​

:ここ

はちょうど古い名前(cpanminusが標準以外の場所にパッケージを置く)を探して簡単な例であります変換されたファイルを見落とすのは簡単です。大文字小文字を無視するかどうかも考慮する必要があります。発音区別符号を無視する

1

、あなたはucagrep.plとしてこのスクリプトの命名1.

#!/usr/bin/perl 

use strict; 
use warnings; 
use Unicode::Collate; 

my $collator=Unicode::Collate->new(level => 1, normalization => undef); 

while (<>) { 
     print if $collator->match($_, "Naufragos") 
} 

レベルでUnicode照合アルゴリズムを使用して検索を使用することができます。

$ echo -e "Náufragos\nNaufragos\nÑaufragos" | perl -CS ucagrep.pl 
Náufragos 
Naufragos 
Ñaufragos 

うう。

#!/usr/bin/perl 

use strict; 
use warnings; 
use Unicode::Collate::Locale; 

my $collator=Unicode::Collate::Locale->new(locale => "es", level => 1, normalization => undef); 

while (<>) { 
     print if $collator->match($_, "Naufragos") 
} 

テストそれ::

$ echo -e "Náufragos\nNaufragos\nÑaufragos" | perl -CS ucagrep.pl 
Náufragos 
Naufragos 

はるかに良い私たちはより良いロケールを指定します。

関連する問題