1

AWKを使用して、フルパスに最大2つの「a」文字を含むファイルを見つける方法を見つけようとしています。

以下は私がこれまでに思いついたものですが、それは仕事をしていません。

BEGIN{}

{
if( match( $1, ".*[a].*[a].*[^a]+" ) )
print $1
}

END{}

次のコマンドで個別に作成された「data」というファイルから、フルパスでファイル名を読み取ります。

find / -name '*'

何を変更すればよいですか?

4

3 に答える 3

6

以下は、それ自体では答えには短すぎると判断されますが、私が書くつもりだったのはそれだけです。

^[^a]*(a[^a]*(a[^a]*)?)?$

ちなみに、あなたは必要ありませんawkgrep -Eうまくいくでしょう。

しかし、今考えてみると、awkを使用する場合は、次の方がさらに簡単です。

awk '!/a.*a.*a/'
于 2012-12-10T19:02:01.383 に答える
2

正しい解決策は次のとおりです。

awk '!/(.*a){3}/' file

または、awkがRE間隔をサポートしていない場合は、次のいずれかを実行します。

awk 'gsub(/a/,"&") < 3' file
awk 'split($0,x,/a/) < 3' file

したがって、どちらの場合でも、17個未満の「a」をテストする場合は、3を17に変更するだけです(たとえば)。

awk '!/(.*a){17}/' file

書くのではなく:

awk '^[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?$'

または類似。

于 2012-12-10T20:11:35.580 に答える
2

3つのエラーがあります。

  1. 行の始まりと行の終わりのパターンを含める必要があります^$そうしないと、任意のプレフィックスまたはサフィックスにいくつかのが含まれる可能性がありますa
  2. a括弧とを使用して、オカレンスをオプションにする必要があり?ます。
  3. .*含むことができるので、非a文字を一致aさせるために使用する必要があります。[^a]

結果は次のような正規表現になります。

^([^a]*a)?([^a]*a)?[^a]*$

編集:

Edが彼の回答の下のコメントで指摘しているように、--re-intervalフラグをAwkに渡すと、間隔を使用できます。

その場合、式は次のようになります。

^([^a]*a){0,2}[^a]*$

これにより、0〜2a秒を検索したいと言うことができます。

于 2012-12-10T19:21:13.403 に答える