Роль `c &&! - c;` при использовании с `awk` - PullRequest
0 голосов
/ 10 мая 2018

Когда я научился использовать awk, я нашел выражение awk 'c&&!--c;/regex/{c=N}' как способ выделить и напечатать N строку ниже строки, соответствующей регулярному выражению. Я понимаю, что c изначально равен 0, поэтому первое совпадение не распечатывается, но, несмотря на то, что я искал верхний и нижний значения, я не знаю, как интерпретировать оставшийся синтаксис (за пределами /regex/) и как он специально знает, как считать N строк перед печатью.

Может кто-нибудь объяснить, что означает c&&!--c и как он работает как счетчик с остальной частью функции?

1 Ответ

0 голосов
/ 10 мая 2018

Первая половина выражения c оценивается как true, если c != 0, как вы правильно догадались.

Вторая половина выражения !--c оценивается как true, если --c оценивается как 0; это происходит, когда c==1 непосредственно заранее. Более того, выражение всегда будет уменьшаться c до тех пор, пока c != 0, поэтому c может служить счетчиком строк.

Когда регулярное выражение совпадает, мы устанавливаем c == N, чтобы после ровно N строк (каждая уменьшается на c на 1), c==1 и awk будут печатать строку.

...