sed
работает с одной строкой за раз, но некоторые комментарии на входе несколько строк. Согласно https://unix.stackexchange.com/a/152389/90751 , вы можете сначала использовать tr
, чтобы преобразовать перенос строки в какой-либо другой символ. Затем sed
может обрабатывать ввод как одну строку, и вы снова используете tr
, чтобы восстановить разрывы строк.
tr '\n' '\0' | sed ... | tr '\0' \n'
Я использовал нулевые байты, но вы можете выбрать любой символ, которого нет во входном файле.
*
имеет особое значение в регулярных выражениях, поэтому для соответствия литералу *
потребуется экранирование как \ *
.
. *
жадный - он будет соответствовать максимально длинному тексту, включая дополнительные * /
и / *
. Это означает первый комментарий, последний комментарий и все, что между ними. Чтобы ограничить это, замените . *
более строгим шаблоном: комментарии могут содержать все, что не является «*», а также «*», за которым следует все, кроме «/». Также необходимо учитывать выполнение нескольких *
s:
tr '\n' '\0' | sed -e 's,/\*\([^*]\|\*\+[^*/]\)*\*\+/,,g' | tr '\0' '\n'
Это удалит любые разрывы строк в многострочных комментариях, т.е.
data1 /* multiline
comment */ data2
превратится в
data1 data2
. Если это не то, что нужно, sed
можно указать сохранить один из переносов строки. Это означает выбор заменяющего символа переноса строки, который может быть сопоставлен.
tr '\n' '\f' | sed -e 's,/\*\(\(\f\)\|[^*]\|\*\+[^*/]\)*\*\+/,\2,g' | tr '\f' '\n'
Специальный символ \ f
и использование обратной ссылки, которая, возможно, не соответствует чему-либо, не гарантируют правильную работу во всех реализациях sed
. (Я подтвердил, что он работает на GNU sed 4.07 и 4.2.2.)
Обновите generate_env_file.sh
, чтобы при запуске проверить, существует ли файл блокировки. Если файл блокировки существует, немедленно выйдите.
Если файл блокировки не существует, немедленно коснитесь файла блокировки, затем займитесь созданием файла конфигурации, а затем удалите файл блокировки.
Другими словами, я не думаю, что systemd
имеет собственный способ обработки ситуации, которую вы описываете, через конфигурацию, поэтому используйте файл блокировки.
И, как указывает @shellter, сайт Unix является более подходящим сайтом для ответов на вопросы systemd
в будущем.
RemainAfterExit=true
является способом. В этом случае Systemd запускает службу, и Systemd считает ее запущенной и работающей. Однако это не покрывает случай, когда нужно выполнить systemctl restart generate_env_file.service
. В этом случае systemd повторно запустит вашу службу. Чтобы решить эту проблему, вы можете создать файл-маркер в файловой системе запуска в ExecStartPost=
и добавить директиву ConditionFileExists=
для проверки существования файла.