Отрицательное регулярное выражение AWK

Отрицательное регулярное выражение AWK

Я ищу регулярное выражение 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

Хотя ответ Томаса Дики и остроумен, есть правильный способ сделать это:

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'

Я придумал это много лет назад и вернулся кэта моя статьявсякий раз, когда мне нужно написать отрицательное регулярное выражение, но, должен признаться, я не помню, как я к этому пришел.

Связанный контент