Linuxのコマンドラインでファイルに含まれる英語の単語を見つけて印刷する方法は?
答え1
GNU grepには次のオプションがあります。
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
。
答え2
彼は面白い!
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
答え3
grep
ベースのソリューションは、特に大きな単語リストの場合、非常に遅いことがよくあります。
単語リストがすでにソートされているという事実を利用できます(しかし、私のシステムでは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
大文字と小文字を区別せずに単語を見つけるには、事前にすべての項目を小文字または大文字に変換することをお勧めします。
答え4
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