AWKを使用して、フルパスに最大2つの「a」文字を含むファイルを見つける方法を見つけようとしています。
以下は私がこれまでに思いついたものですが、それは仕事をしていません。
BEGIN{}
{
if( match( $1, ".*[a].*[a].*[^a]+" ) )
print $1
}
END{}
次のコマンドで個別に作成された「data」というファイルから、フルパスでファイル名を読み取ります。
find / -name '*'
何を変更すればよいですか?
以下は、それ自体では答えには短すぎると判断されますが、私が書くつもりだったのはそれだけです。
^[^a]*(a[^a]*(a[^a]*)?)?$
ちなみに、あなたは必要ありませんawk
。grep -E
うまくいくでしょう。
しかし、今考えてみると、awkを使用する場合は、次の方がさらに簡単です。
awk '!/a.*a.*a/'
正しい解決策は次のとおりです。
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]*)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?$'
または類似。
3つのエラーがあります。
^
。$
そうしないと、任意のプレフィックスまたはサフィックスにいくつかのが含まれる可能性がありますa
。a
括弧とを使用して、オカレンスをオプションにする必要があり?
ます。.*
含むことができるので、非a文字を一致a
させるために使用する必要があります。[^a]
結果は次のような正規表現になります。
^([^a]*a)?([^a]*a)?[^a]*$
編集:
Edが彼の回答の下のコメントで指摘しているように、--re-interval
フラグをAwkに渡すと、間隔を使用できます。
その場合、式は次のようになります。
^([^a]*a){0,2}[^a]*$
これにより、0〜2a
秒を検索したいと言うことができます。