Вообще-то, это интересный вопрос. @tink указал, почему ваш код не работает должным образом, но вопрос был не в этом. Вопрос был в том, «почему 0
иногда совпадает».
Если (/ foo / ~ $ 1)
действительно означает (($ 0 ~ / foo /) ~ $ 1)
, то ($ 0 ~ / foo /)
будет оцениваться как 1
, если строка содержит foo
, и 0
в противном случае. Таким образом, вы (в основном) оцениваете 0 ~ $ 1
. Если строка ввода пуста, тогда $ 1 == ""
, и всегда соответствует пустое регулярное выражение. Если входная строка равна точно 0
, то $ 1
равно $ 1
, а 0 ~ 0
истинно. Если строка ввода, например, 000
, то это же $ 1
, и 0 ~ 000
не должно быть истинным. Однако вполне вероятно, что 000
преобразуется в 0
перед проверкой совпадения.
Но, к сожалению, это объяснение не охватывает всех случаев.
Случай 1
0 <-- found match
a
0 <-- found match
0 <-- found match
Это именно то, что ожидалось.
Случай 2
0 <-- found match
00 00 <-- found match
0 <-- found match
Это также то, что ожидается, при условии, что любое количество нулей интерпретируется как 0
. Но теперь это:
Случай 3
0 <-- found match
a
00 0
0
Это не может быть объяснено так просто. После неудачного совпадения преобразования в ноль не происходит, и следующие строки, которые должны совпадать, не выполняются.
Случай 4
0 <-- found match
a
00 00
a
0 <-- found match
Что бы ни случилось, другое неудавшееся сопоставление, похоже, сбрасывает поведение awk
до нормального, и сопоставление снова работает должным образом.
В заключение, либо объяснение из справочной страницы GNU awk
, которая, кстати, не является частью информационной страницы, неверно (или, по крайней мере, неполно), либо программа содержит Жук.