Может кто-нибудь объяснить мне, почему awk sub()/gsub() работает так?

Я знаю, что awk может выполнять подстановку текста/строки с помощью sub() и gsub() вроде:

kent$ echo "fffff"|awk '{gsub("f", "b")}1'
bbbbb

или

kent$ echo "fffff"|awk '{gsub(/f/, "b")}1'
bbbbb

Однако сегодня я допустил ошибку типографии, я написал строку как:

kent$ echo "fffff"|awk '{gsub('f', "b")}1'

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

bfbfbfbfbfb

другой пример:

kent$ echo "fafafafafXX"|awk '{gsub('fa', "B")}1'
BfBaBfBaBfBaBfBaBfBXBXB
Пример

с sub() тоже странный:

kent$  echo "thanks in advance"|awk '{sub('a', "B")}1'
Bthanks in advance

Может ли кто-нибудь объяснить мне, как была сделана странная замена?

kent$  awk --version
GNU Awk 4.0.2

ИЗМЕНИТЬ

спасибо за ответ от Джони. возможно, этот пример объясняет это лучше, я просто добавляю его здесь:

kent$  echo "thanks in advance"|awk '{f="k";sub('f', "B")}1'
thanBs in advance

kent$  echo "thanks in advance"|awk '{sub('th ank', "B")}1'
awk: cmd. line:2: {sub(th
awk: cmd. line:2:        ^ unexpected newline or end of string

Ответы

Ответ 1

Когда вы пишете

echo "fffff"|awk '{gsub('f', "b")}1'

то, что awk видит, это {gsub(f, "b")}1. Он интерпретирует f как переменную с пустым значением и заменяет каждую пустую строку на входе с помощью b.

Пустая строка найдена между каждым символом и после последнего, так что awk вставляет b после каждого f.

Вы можете заменить // или "" на тот же эффект, без неиспользуемой переменной:

echo "fffff"|awk '{gsub(//, "b")}1'            # fbfbfbfbfb