Добавьте -E
и удалите квадратные скобки:
$ sed -E 's/fastcgi_param WP_ENV \w+/fastcgi_param WP_ENV production/g' file
fastcgi_param WP_ENV production;
Примечания:
+
не поддерживается в основных регулярных выражениях. -E
включает расширенное регулярное выражение, которое поддерживает +
.
\ w +
соответствует одному или нескольким символам слова. [\ w +]
соответствует любому из \
, w
или +
.
\ w
не переносится. Для совместимости с POSIX используйте:
$ sed -E 's / fastcgi_param WP_ENV [[: alnum:]] + / fastcgi_param WP_ENV production / g' file
fastcgi_param WP_ENV production;
Вы можете избежать двойного ввода строки, используя группу захвата:
$ sed -E 's / (fastcgi_param WP_ENV) [[: alnum:]] + / \ 1 production / g' file {{1} } fastcgi_param WP_ENV production;
echo
выдаст только одну строку, а wc
будет считать эту строку.
Обратите внимание, что конечная временная метка не существует 13:41:43
, а используемые якоря (^
и $
) слишком ограничительны.
Удалите echo
и попробуйте следующее:
sed -n '/13:40:43/,/13:41:49/p' somelogfile.log | wc -l
Рассмотрим эту команду:
echo sed -n '/^13:40:43$/,/^13:41:43$/ p' somelogfile.log | wc -l
Рассмотрим, что делает echo
и что идет через трубу к wc
(просто попробуйте без wc
). Это объясняет, почему вы всегда получаете 1
.
Написанные вами регексы привязаны к началу ^
и концу $
строки, но, конечно, эти временные метки - не единственное, что есть в строке, поэтому вам следует убрать якоря.
Условие end ищет временную метку, которой нет в вашей выборке, поэтому диапазон совпадений никогда не закончится, печатая все, начиная с первого совпадения.
Что-то вроде этого может сделать примерно то, что вы просите (вывод 3
с входным файлом, показанным в вопросе)
sed -ne '/13:40:47/,/13:41:48/p' somelogfile.log | wc -l
Если хронологический порядок совпадает с лексическим, можно просто сделать:
awk '$0>="[11/Jul/2016:13:40:00" && $0<="[11/Jul/2016:13:41:59"' file | wc -l
Здесь проверяется, больше или равно ли значение первой дате и меньше или равно второй дате. Если в awk
не задана команда, awk
просто выводит строку.