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

Это особенность vte (gnome-terminal) и консоль. Согласно git-log vte, он был добавлен в ноябре 2002 г. :

handle end-of-line selection correctly. Stop highlighting selection on
* src/vte.c: handle end-of-line selection correctly.  Stop highlighting
    selection on click, but don't lose it until new text is selected.
* python/vte.override: fix binding for set_colors() to properly take a
    list of colors for the palette (#97682).
* src/vte.c, src/vte.h: add increase-font-size and decrease-font-size to allow
    mimicking XTerm's and Mozilla's behavior on Shift/Control
    KP_Add/KP_Subtract
* src/vteapp.c: handle increase-font-size and decrease-font-size.

Konsole добавил его в апреле 2007 г. :

Add menu items and shortcuts to increase and decrease font size. I have tried to keep as close as possible to the recommended Zoom In/Out shortcuts given that Ctrl+[Key] shortcuts cannot be used because they are reserved for terminal application use. Ctrl++ zooms in, Ctrl+Shift+- zooms out.

Что касается сочетаний клавиш, xterm использовал сдвинутую клавиатуру плюс / минус с 1999 г. , имитирующий rxvt, который представил эту функцию несколькими годами ранее (см. в версии 2.18 , август 1996 г.).

Это четыре реализации за более чем 10 лет. В macOS (OSX) Terminal.app и iTerm2 выполняют обе функции (используя команду , а не control ), но поскольку нет надежной документации по Terminal.app, трудно сказать, когда функция была добавлена.

Опять же, есть несколько эмуляторов терминалов, в которых эта функция отсутствует (все еще).

8
25.10.2016, 20:13
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'

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

1
27.01.2020, 20:09

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

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

This is do test
This is test
26
27.01.2020, 20:09

Попытки использовать следующие 3 метода

Первый метод с использованием awk

команда

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

выход

This is do test
This is test

метод2 с использованием sed

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

выход

Это проверка Это тест

Третий метод с использованием Python

#!/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
1
27.01.2020, 20:09

Because you stated "Need to do with regular expression only. Can not change the Awk code" try this:

Вместо "отрицания оператора" вы можете "отрицать регулярное выражение" . Вам просто нужно передать символ отрицания!как часть регулярного выражения !/domain/в сценарий awk.

awk '{if ($0 ~ !/domain/) {print $0}}'
5
27.01.2020, 20:09

Теги

Похожие вопросы