Диапазон поиска Vi и замена

Ответ, похоже, заключался в том, чтобы поместить следующее в мой сценарий init.d, который я поместил непосредственно перед вызовом start-stop-daemon в do_start:

ulimit -r ## (where ## is a sufficiently high number; 99 works)

Я смог определить это, выполнив системные вызовы ulimit -a внутри команды bash внутри моего кода:

bash -c "ulimit -a"

Часть bash необходима, потому что ulimit -a является встроенной оболочкой. ulimit -a on / bin / sh возвращает различную информацию, не связанную с приоритетом реального времени. По какой-то причине я обнаружил, что мой приоритет в реальном времени был ограничен до 0 (без приоритета в реальном времени), когда моя служба запускается при загрузке. Когда я запускаю его со службой или вызывая сценарий init.d, он наследует мои разрешения, которые позволяют устанавливать приоритет в реальном времени. Но когда система вызывает его через систему обратной совместимости Upstart / SystemV, она не получает таких повышенных привилегий. Я полагаю, это может относиться к сообщениям, которые я видел, в которых говорится, что Upstart не читает /etc/security/limits.conf, где вы должны установить общесистемные разрешения приоритета в реальном времени для непривилегированных пользователей.

Если кто-нибудь может проверить или объяснить, почему это решение работает, я хотел бы его услышать.

2
16.09.2017, 14:12
1 ответ

Основные проблемы здесь связаны с использованием сокращенных обозначений \wи \s. Если редактор представляет собой традиционную реализациюvi(оригинальных исходников Билла Джоя ), то можно дополнительно установить параметр magic, который установлен по умолчанию в большинстве современных реализаций vi.. Это делается с помощью :set magic.


viне понимает \wи \sи аналогичную сокращенную запись для различных классов символов, как vim.

Чтобы выполнить замену в vi, используйте

:%s/^\(group[  ][  ]*\)[0-9A-Za-z_]/\1Test/

Согласно документации vim, \wсоответствует [0-9A-Za-z_], а \sявляется пробелом или табуляцией (в [ ]выше есть пробел и табуляция ).

Шаблон E+, где E— некоторое выражение, может быть заменен на EE*.

\1в замещающей части подстановки должно работать вvi(любойvi). Если это не так, попробуйтеnvi("новый vi" )или посмотрите, сможете ли вы установить vim.

Исходный vi(, упакованный как traditional-viпо крайней мере в некоторых системах BSD ), должен иметь свои «специальные символы» (, за исключением экранированных ^и $), например \*и \.. ] и т. д. Кроме того, вы можете установить параметр magicс помощью :set magic(. Обычно это значение по умолчанию в современных viреализациях ).

Вышеуказанная замена заменит все вхождения (, например)

group 1

с

group Test

Еще один способ сделать то же самое, что и вы:

:g/^group/s/[0-9A-Za-z_]$/Test/

или просто

:g/^group/s/.$/Test/

если вам не нужно быть слишком осторожным с последним символом в строке.

Если вы хотите заменить последнее слово (, а не только последний символ )в строке:

:g/^group/s/[^ ]*$/Test/

В традиционном viбез установленного параметра magicэто, возможно, придется написать

:g/^group/s/\[^ ]\*$/Test/
5
27.01.2020, 21:55

Теги

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