web-dev-qa-db-ja.com

ターミナル経由でファイル内の英語の単語を探す

Linuxコマンドラインを介してファイルに含まれている英語の単語を見つけて印刷するにはどうすればよいですか?

6
verdy

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ファイルにはパッケージcracklibhttp://sourceforge.net/projects/cracklib が付属しています

3
Gilles Quenot

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

大文字と小文字を区別しない方法で単語を検索する場合は、事前にすべてを小文字または大文字に変換することもできます。

2
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
1
Peter.O