awk печатает строки, совпадающие с шаблоном, и если строка с шаблоном1 имеет шаблон2, то печатает строку с шаблоном1 и n-ю строку после как одну строку

Вообще говоря, вам нужно доработатьzstyleвызов , чтобы он применялся не ко всем завершениям, а только к завершению файла. Для обычного завершения синтаксис спецификатора контекста — :completion:WIDGET:COMPLETER:COMMAND:ARGUMENT:TAG.

  • WIDGETустанавливается только некоторыми специальными виджетами, оставьте его общим(*).
  • COMPLETERсоответствует completeдля нормального завершения и может иметь другие значения для таких задач, как автоисправление.
  • COMMANDобычно является именем команды, аргументы которой завершаются. Точнее, это слово после compdef. Некоторые сложные команды меняют его при выполнении подкоманд. Для особых мест в синтаксисе оболочки это имя контекста между тире , например -parameterпосле $или -command-для первого слова в команде.
  • ARGUMENTобычно что-то вроде argument-3для третьего аргумента опции, отличной от -, или option--foo-1для аргумента опции --foo.
  • TAGиспользуется внутри некоторых функций завершения, часто, но не всегда, одним из обычных имен тегов .

Вzstyleобъявлениях более конкретные объявления имеют приоритет над менее конкретными.

  • Объявление с большим количеством двоеточий(:)является более конкретным, чем объявление с меньшим количеством двоеточий.
  • При равном количестве столбцов объявление является по крайней мере столь же конкретным, как и другое, если каждая часть, -разделенная двоеточием, по крайней мере так же специфична, как и соответствующая часть в другом объявлении. Для каждой части :
    • *является более конкретным, чем что-либо еще.
    • Любая строка с подстановочными знаками является более конкретной, чем простая строка без подстановочных знаков.

Таким образом, чтобы сделать исключение для имен команд, просто добавьте еще одно zstyleобъявление, относящееся именно к командам.

Тем не менее, есть поворот :matcher-list, который применяется глобально, а не в контексте завершения. В вашем случае, если вам нужен только один сопоставитель, вместо этого вы можете использовать matcher.

zstyle ':completion:*' matcher 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'
zstyle ':completion:*:*:-command-:*' matcher 'm:{a-zA-Z}={A-Za-z}'

3
24.01.2020, 10:23
1 ответ
$ cat tst.awk
{
    sub(/\r$/,"")
    txt = substr($0, index($0,$3))
}
/\[(FATAL|ERROR)[^]]*] \[.*]/ {
    if ( /error running program:/ ) {
        pfx = txt OFS
        cnt = 4
    }
    else {
        cnt = 1
    }
}
cnt && !--cnt { print pfx txt; pfx="" }

$ awk -f tst.awk file
[ERROR  ] [PID] error running program: message from n lines below
[ERROR  ] [PID] some error:
[ERROR  ] [PID] error running program: message from n lines below
2
27.01.2020, 21:24

Теги

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