![AWK 否定正規表現](https://rvso.com/image/97224/AWK%20%E5%90%A6%E5%AE%9A%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE.png)
特定の単語に一致しないすべての文字列を返す 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'
私は何年も前にそれを思いつき、私のその記事否定の正規表現を書く必要があるときはいつでも、どうやってそれにたどり着いたか覚えていないと言わざるを得ません。