Linuxコマンドラインを介してファイルに含まれている英語の単語を見つけて印刷するにはどうすればよいですか?
GNUgrepには次のオプションがあります。
grep --only-matching --ignore-case --fixed-strings --file /usr/share/dict/british-english-insane /path/to/file.txt
これにより、1行に1つずつ見つかった文字列が出力されます。ここに /usr/share/dict/british-english-insane
はDebianパッケージによって提供されるワードリストですwbritish-insane
。
彼、おかしい!
file=/usr/share/licenses/common/GPL3/license.txt
dict=/usr/share/dict/cracklib-small
while read Word; do
grep >/dev/null -i "\<$Word\>" $file &&
printf 'Word "%s" found in GPLv3...\n' $Word
done < $dict
出力:
Word a found in GPLv3...
Word ability found in GPLv3...
Word about found in GPLv3...
(...)
Cracklib-smallファイルにはパッケージcracklib
http://sourceforge.net/projects/cracklib が付属しています
grep
ベースのソリューションは、特に大きなWordリストの場合、一般的に非常に遅くなります。
Wordリストはすでにソートされているという事実を利用できます(ただし、私のシステムでは、UTF-8でエンコードされていても、少なくともイギリス英語のリストはPOSIX/Cロケールでソートされているようです)。
tr -cs "[:alpha:]'" '[\n*]' < /etc/passwd |
LC_ALL=C sort -u |
LC_ALL=C comm -12 - /usr/share/dict/british-english-insane
大文字と小文字を区別しない方法で単語を検索する場合は、事前にすべてを小文字または大文字に変換することもできます。
file=/usr/lib/python2.6/LICENSE.txt
dict=/usr/share/dict/british-english-huge # or any suitable list
sort "$dict" \
<(sed "s/[].,\"?!;:#$%&()*+<>=@\^_{}|~[]\+/\n/g # keep ' for now
s|[-/[[:digit:][:blank:][:cntrl:]]\+|\n|g
s/\<'\+/\n/; s/'\>\+/\n/ # remove '
" <(<"$file" tr '[:upper:]' '[:lower:]') ) |
uniq -c | awk '$1 > +1 {print $2}'
時間内に382語(大文字と小文字を区別しない)が見つかりました:
real 0m1.723s
user 0m1.872s
sys 0m0.048s