Солярис /usr/bin/awk
очень старый awk, который не поддерживает функции пользователя. Таким образом в этом awk, float(123)
совпадает с anything(123)
или anything 123
, это - конкатенация значения float
или anything
переменная (пустой, если не набор) и 123
. Так, это не ошибка, но это ничего не делает.
Вы записали
echo "Foampile=123" | awk -F '=' '{float="x"; print float($2) "<->" $1}'
Вы видели бы
x123<->Foampile
Я не думаю, что существует любая awk реализация, которая имеет a float
функция.
Что Вы ожидали бы что функция делать так или иначе?
С другой стороны, современный POSIX awks как Солярис /usr/xpg4/bin/awk
или nawk
или gawk
действительно поддерживайте функции пользователя, таким образом, в тех, если Вы не определяете float
или anything
функция, Вы будете видеть ту ошибку.
echo "Foampile=123" | awk -F '=' '{ print $2 "<->" $1 }'
работал бы точно то же (и будет работать с современным awks).
В современном awks, для устранения неоднозначности между вызовом функции и конкатенацией переменной и чего-то в фигурной скобке необходимо добавить по крайней мере одно дополнительное пространство:
$ echo x | awk '{print foo ($1)}'
x
$ echo x | awk 'function foo(x) {return "y"}; {print foo($1)}'
y
Там пара ошибок.
Во-первых, так как sed
использует основные регулярные выражения, то для создания группы захвата необходимо \(
и \)
. Переключатель -r
включает расширенные регулярные выражения, поэтому вы не получите ошибку. Смотрите Почему мне нужно экранировать регексные символы в sed для их интерпретации как регексные символы?.
Во-вторых, вы помещаете группу захвата не в то место. Если я вас правильно понял, вы можете это сделать:
sed -e 's!^\(\s*access_log\)[^;]*;!\1 /dev/stdout;!' your_file
Обратите внимание на использование !
в качестве разделителей регрессов, чтобы избежать необходимости избегать прямых косых черт в /dev/stdout
.
В вашем Regexp вы должны знать, что \ NO.
- это ссылка на обратную ссылку для узора в скобках ()
. Таким образом, Regexp должен быть s @ ^ (\ s * access_log). * $ @ \ 1 / dev / stdout /; @ '
Я могу предложить
sed '/access_log/s|/[^;]\+|/dev/stdout|'
HINT: намерен использовать /
Внутри патерна вы можете свободно изменить ///
для каждого символа, который вы хотели бы S ###
, например
Почему бы просто не найти его и не произвести замену, а не захватить его? То есть:
sed "/access_log/ s| /.*;| /dev/stdout;|"
Он ищет строки, которые соответствуют « access_log
», а затем во всех строках, которые это делают, он заменяет « / something / path / is / there;
» на « ] / dev / stdout;
"