1

長さ n の単語が 1 行に出現するのを見つけるには、どのようなパターンを使用できますか?

私はやろうと思った:

grep -ni ' '[a-z][a-z][a-z][a-z][a-z][a-z]' ' filename

しかし、これは行頭または行末の 6 文字の単語の一致を考慮していません。spaceまたはを一致させる方法はありbeginning/end of a lineますか? また、パターン [az] を n 回入力する代わりに n 回検索する方法はありますか?

私はそれ^が行頭と行末であることを知ってい$ます。

たとえば、私が欲しいもののいくつかの疑似スクリプト:

#match a word of n length(n consecutive letters)
grep -ni ^ OR [:space:][a-z]{n consecutive times}[:space:] OR $ filename 
4

3 に答える 3

3

GNU grep には、単語の先頭と単語の末尾に一致する演算子が\<あり、\>

拡張正規表現の繰り返し演算子と組み合わせると、{N}使用できることを意味します

egrep -i '\<[a-z]{6}\>'

または、少し読みにくいですが、おそらくより移植性が高く、|「OR」に代替演算子を使用して、括弧でグループ化できます。

egrep -i '(^|[[:space:]])[a-z]{6}([[:space:]]|$)'

これらのアプローチの動作の違いに注意する必要があります。単語の境界はスペースだけでなく句読点でも発生するため、\<and \>(または GNU grep に最近追加された perl っぽい\band ) を使用すると\b、文末の単語も一致し、代わりにドットが続きます。スペースの。

それは良いことかもしれませんが、悪い面はあなたwouldn'tも一致するということwouldnです.6文字とアポストロフィは単語の境界だからです.

于 2013-10-22T20:54:24.607 に答える
2

この正規表現:

\b\w{6}\b

[a-z]... 単語の境界 ( のような単語の文字と のような非単語の文字の間の遷移、または行' 'の先頭または末尾のいずれか) に一致し、その後に 6 つの単語の文字が続き、その後に別の単語の境界が続きます。egreporが必要になります。拡張正規表現構文grep -Eであるためです。{6}

egrep -ni '\b\w{6}\b' filename

数字とアンダースコアを一致させたくない場合は、に置き換えることができます (一致し\wます) 。[a-z]\w

于 2013-10-22T20:56:55.967 に答える
1

ほとんどの grep 実装には-w、一致する部分文字列が行の先頭にあるか、単語以外の構成文字が先行しているか、行末にあるか、または単語以外の構成文字が続いているかどうかのオプションがあります。単語構成文字は、少なくとも私が使用している grep の実装では、文字、数字、およびアンダースコアです。

そう:

$ egrep -wi '[a-z]{6}' filename

これにより、私の経験では、grep で常にサポートされているとは限らない単語境界を要求する必要がなくなります。(この-iオプションにより、大文字と小文字が区別されなくなります。)

「基本」正規表現ではなく「拡張」正規表現を評価するためegrepに代わりに使用します。grepそこにあるほとんどすべての grep は、これらの両方を理解します。grep -P移植性に関心がある場合は、PCRE ( ) を避けてください。

于 2013-10-22T21:12:08.880 に答える