私は特定の単語と一致しないすべての文字列を提供するawk正規表現を探しています。
/^((?!word \+).)*/
Javaでは機能しますが、AWKでは機能しません。
コンパイル失敗エラーが発生して角かっこをエスケープすると、コンパイルエラーは解決されましたが、正規表現の一致が正しくありませんでした。
誰もがawk正規表現に役立つことができれば良いでしょう。
利用できません string" !~ /regex/
string" ~ /regex/
正規表現を使用して、すべての文字列を除く特定の文字列を渡す必要があります。
含まれる文字列はdomain
フィルタリングする必要があります。入力する
This is domain test
This is do test
This is test
出力
This is do test
This is test
ただ正規表現を使用してください。 awkコードを変更できません
AWKでは次のようになりますstring" ~ /regex/
したがって、これは正規表現でのみ達成できます。
答え1
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
答え2
awkでこれを行う方法は、必要なものと一致するパターンを作成することです。入らないようにする、そしてそれを作る行動 next
。これにより、実装するパターンの否定を処理する必要がある行が残ります。
このような:
/regex/{ next; }
{ print; }
または、スクリプトがより複雑で、次のものが利用できない場合next
:
<<<'the quick brown fox jumps over the lazy dog'$'\n''pack my box with five dozen liquor jugs' awk '
{ negate=0 }
/box/{ negate=1 }
negate==1 { gsub(/[aeiou]/, "%") }
negate==0 { gsub(/[aeiou]/, "#") }
{ print NR, $0; }
'
# output
1 th# q##ck br#wn f#x j#mps #v#r th# l#zy d#g
2 p%ck my b%x w%th f%v% d%z%n l%q%%r j%gs
答え3
君が言ったから「正規表現のみを使用してください。Awkコードを変更することはできません。」この試み:
「否定演算子」の代わりに「正規表現を否定」することができます。。君はただ通過すればいいまあ!
!/domain/
awkスクリプト正規表現の一部として。
awk '{if ($0 ~ !/domain/) {print $0}}'
答え4
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'
実は数年前もこの考えをして再び思い出しました。私の記事否定的な正規表現を書く必要があるたびにどのように書いたか覚えていないことを認めなければなりません。