
私が指定した特定の基準を満たすすべての単語に対して/usr/dict/wordsを検索するスクリプトを作成したいと思います。たとえば、すべての回文の単語(「racecar」、「madam」など)を検索したり、最初と2番目の半分が反転して単語を形成するすべての単語(「german」や「manger」など)を見つけます。 。スクリプトのスケルトンは、辞書の各単語を読み取る簡単なループになり、探している項目に応じて式や類似の項目を置き換えることによって基準を変更できます。
どういうわけか正規表現を含める必要があると思います(または各単語の個々の文字を表示する方法を見つける必要があります)。また、現在の単語の文字を辞書の他の単語と比較する方法も必要です(上記の2番目の例のように)。
これに最適なツールは何ですか?
答え1
次のperl
スクリプトは、標準入力および/またはコマンドラインにリストされているファイル名から単語リストを読み取り、見つかったすべての回文と元に戻すことができる単語を印刷します。 3文字未満の単語は無視します(主に私の/usr/share/dict/words
ファイルには「A」や「Aa」などのゴミが多いためです)。
これは非常に単純なPerlで書かれており、「賢い」Perlトリックを使用せずにできるだけ簡単に理解して修正できるように設計されています。
#! /usr/bin/perl
use strict;
my %dict = ();
print "Palindromes\n";
print "-----------\n";
while(<>) {
chomp;
next if (length($_) < 3);
$dict{$_} = 1;
print "$_\n" if ($_ eq reverse($_));
}
print "\n\nReversibles\n";
print "-----------\n";
foreach my $key (keys %dict) {
my $len = length($key);
my $firsthalf = '';
my $secondhalf = '';
if (($len / 2) == int($len/2)) {
# even length words
$firsthalf = substr($key,0,int($len/2));
$secondhalf = substr($key,int($len/2));
} else {
# odd length words
$firsthalf = substr($key,0,int($len/2)+1);
$secondhalf = substr($key,int($len/2)+1);
};
my $rev = $secondhalf . $firsthalf;
next unless (exists $dict{$rev});
# don't print if reversed word is a palindrome
next if ($rev eq $key);
print "$key => $rev\n";
}
次の出力を生成します。
$ ./find-P-and-R.pl /usr/share/dict/words
Palindromes
-----------
MGM
aba
abba
aga
aha
aia
aka
...
...
...
Reversibles
-----------
mode => demo
reenter => terreen
juba => baju
oon => noo
lave => vela
lassi => silas
updo => doup
air => rai
...
...
...
答え2
正規表現でのみフィルタリングする必要がある場合は、を使用してくださいgrep
。ただし、正規表現以上の機能が必要です。おなじみのプログラミング言語を使用できます。 AwkはすべてのPOSIXシステムに存在し、ファイルを1行ずつ簡単に処理できますが、プログラミング機能は最高レベルではありません。 Perlは1行ずつ簡単に処理でき、より良い文字列処理機能と多くのライブラリを使用できます。 Pythonは学習しやすく、非常に便利なライブラリセットを備えています。他の多くの可能性があります。
回文を確認するには、* BSDとLinuxで次のものを使用できます。rev
パイプラインのユーティリティ。ファイルのすべての行を逆に置き換えます。回文を探す:
rev /usr/dict/words | paste /usr/dict/words - | sed -n 's/^\(.*\)\t\1$/\1/p'
perl -l -ne 'print if reverse($_) eq $_' /usr/dict/words
元に戻すことができる単語を探す:
rev /usr/dict/words | grep -Fxf /usr/dict/words
perl -l -ne '$dict{$_} = 1; END {foreach (keys %dict) {print if $dict{reverse($_)}}}'
答え3
sedコマンドの逆参照とサブ式を使用して、多くの操作を実行できます。以下は2つの例です。
例 1: 辞書の途中に o を含む 3 文字の会文の単語を探す
$ sed -E -n '/^(.)o\1$/p' /usr/share/dict/words
bob
mom
non
pop
sos
tot
wow
例2:6文字の会文の単語を検索する
$ sed -E -n '/^(.)(.)(.)\3\2\1$/p' /usr/share/dict/words
redder