Замените содержание группы получения regex, использующее sed

Солярис /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
16
02.11.2014, 22:43
3 ответа

Там пара ошибок.

Во-первых, так как sed использует основные регулярные выражения, то для создания группы захвата необходимо \( и \). Переключатель -r включает расширенные регулярные выражения, поэтому вы не получите ошибку. Смотрите Почему мне нужно экранировать регексные символы в sed для их интерпретации как регексные символы?.

Во-вторых, вы помещаете группу захвата не в то место. Если я вас правильно понял, вы можете это сделать:

sed -e 's!^\(\s*access_log\)[^;]*;!\1 /dev/stdout;!' your_file

Обратите внимание на использование ! в качестве разделителей регрессов, чтобы избежать необходимости избегать прямых косых черт в /dev/stdout.

16
27.01.2020, 19:48

В вашем Regexp вы должны знать, что \ NO. - это ссылка на обратную ссылку для узора в скобках () . Таким образом, Regexp должен быть s @ ^ (\ s * access_log). * $ @ \ 1 / dev / stdout /; @ '

Я могу предложить

sed '/access_log/s|/[^;]\+|/dev/stdout|'

HINT: намерен использовать / Внутри патерна вы можете свободно изменить /// для каждого символа, который вы хотели бы S ### , например

5
27.01.2020, 19:48

Почему бы просто не найти его и не произвести замену, а не захватить его? То есть:

sed "/access_log/ s| /.*;| /dev/stdout;|"

Он ищет строки, которые соответствуют « access_log », а затем во всех строках, которые это делают, он заменяет « / something / path / is / there; » на « ] / dev / stdout; "

3
27.01.2020, 19:48

Теги

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