特定の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/
したがって、これを達成するために正規表現のみを渡すことができます。
これをawkで行う方法は、目的のパターンexcludeに一致するパターンを記述し、そのパターンをにすることです。 actionnext
。これにより、達成しようとしているパターンの否定である行が処理されます。
このようなもの:
/regex/{ next; }
{ print; }
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
awk
はPCRE(Perl互換正規表現)をサポートしていないため、使用している負の先読みのようなゼロ幅の先読みを使用できません(?!Word +)
。
awk
のRegexエンジンは、ERE(拡張正規表現)のみをサポートしています。そこにすべてのロジックを組み込む必要があります。そうしないと、ロジックを分割してニーズを満たすことができます。また、awk
の組み込み関数を確認し、それらが役立つかどうかを確認します。
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'
私はその数年前に思い付き、否定的な正規表現を書く必要があるときはいつでも 私の記事 に戻ってきましたが、管理者でなければなりませんでした。
"正規表現のみで行う必要があります。Awkコードを変更できません"これを試してください:
「演算子の否定」の代わりに、「正規表現を無効にする」ことができます。 否定記号!
正規表現の一部として!/domain/
awkスクリプトに。
awk '{if ($0 ~ !/domain/) {print $0}}'
以下の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