web-dev-qa-db-ja.com

AWK負の正規表現

特定のWordに一致しないすべての文字列を提供できるawk正規表現を探しています。

/^((?!Word \+).)*/の使用はJavaで機能しますが、AWKでは機能しません。

コンパイル失敗エラーを取得し、大括弧をエスケープするとコンパイルエラーは修正されますが、正規表現のマッチングは正しくありません。

誰かがawkの正規表現を手伝ってくれるといいですね。

string" !~ /regex/は使用できません

特定の文字列を除くすべての文字列に対してstring" ~ /regex/ regex shuouldパスを使用する必要があります。

domainを含む文字列は除外する必要があります。入力

This is domain test
This is do test
This is test

出力

This is do test
This is test

正規表現のみを使用する必要があります。 Awkコードを変更できません

aWKではstring" ~ /regex/

したがって、これを達成するために正規表現のみを渡すことができます。

12
kshitij

これをawkで行う方法は、目的のパターンexcludeに一致するパターンを記述し、そのパターンをにすることです。 actionnext。これにより、達成しようとしているパターンの否定である行が処理されます。

このようなもの:

/regex/{ next; }
{ print; }
13
Thomas Dickey

Thomas Dickeyの答えは賢いですが、これを行う正しい方法があります。

awk '!/domain/ {print}' <<EOF
This is domain test
This is do test
This is test
EOF

This is do test
This is test
13
Bruno Bronosky

awkはPCRE(Perl互換正規表現)をサポートしていないため、使用している負の先読みのようなゼロ幅の先読みを使用できません(?!Word +)

awkのRegexエンジンは、ERE(拡張正規表現)のみをサポートしています。そこにすべてのロジックを組み込む必要があります。そうしないと、ロジックを分割してニーズを満たすことができます。また、awkの組み込み関数を確認し、それらが役立つかどうかを確認します。

2
heemayl

POSIX拡張正規表現を使用して否定パターンを作成することは、特に注意が必要です。すべての文字が異なるdomainのような文字列の場合、次のことを試すことができます。

awk -v re="^([^d]|d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]\
*o(d*d[^do]|[^dm])|[^da])|[doma]*a(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom\
]*m(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[^da])|[^di])|[domai]*i(d*d[^do]|[d\
o]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[^da])|[do\
ma]*a(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]*o(d*d[^do]|\
[^dm])|[^da])|[^di])|[^dn]))*[domai]*\$" '$0 ~ re'

私はその数年前に思い付き、否定的な正規表現を書く必要があるときはいつでも 私の記事 に戻ってきましたが、管理者でなければなりませんでした。

2

"正規表現のみで行う必要があります。Awkコードを変更できません"これを試してください:

「演算子の否定」の代わりに、「正規表現を無効にする」ことができます否定記号!正規表現の一部として!/domain/ awkスクリプトに。

awk '{if ($0 ~ !/domain/) {print $0}}'
1
N.Nonkovic

以下の3つの方法で試した

Awkを使用する最初の方法

コマンド

awk '$0 !~/domain/{print $0}' file.txt

出力

This is do test
This is test

sedを使用するmethod2

sed -n '/domain/!p' file.txt

出力

これはテストですこれはテストです

Pythonを使用する3番目の方法

#!/usr/bin/python
k=open('test.txt','r')
for i in k:
    if "domain" not in i:
        print i.strip()

出力

This is do test
This is test
0