Я пытаюсь использовать sed для увеличения номера версии в файле conf. Номер версии имеет следующий вид:
MENDER_ARTIFACT_NAME = "release-6".
Используя следующее:
sed -r 's/(.*)(release\-)([0-9]*)(.*)/echo "\1\2$((\3+1))\4"/ge'
Результат такой:
MENDER_ARTIFACT_NAME = release-7
I.E. он работает, но пропускает кавычки. Я проверил документы регулярных выражений, и (. *) Должен соответствовать всем символам, отличным от новой строки, любое количество раз, поэтому первый должен соответствовать всему, включая цитату, до release-6, а второй должен соответствовать всему, включая цитату, после release-6. Вместо этого он, кажется, полностью отбрасывает кавычки. Что я делаю неправильно?
Я сделал, да. Я не понимал, что отдельные строки команд bash требуют указания авторства. Извините.
@revo, это имеет смысл, спасибо. Если вы хотите добавить это в качестве ответа, я приму его
Я не знаю насчет «требовать атрибуции», это даже не моя точка зрения. Я сказал "хорошее дело". Например: «Я не придумал это, я взял это отсюда». Закон не должен требовать, чтобы делать то, что прилично.
Я не понимал, что такие вещи нужны для «приличия». Я никогда не ожидал, что мне будут зачислены отдельные строчки моего кода, но если другие будут, то сделаю это в будущем. Считайте меня достойным раскаяния.
Не имеет отношения к вопросу: release\- - вне класса символов тире (-) является обычным символом, его не нужно экранировать.
@axiac Хорошее замечание, спасибо!





Согласно документация:
the
eflag executes the substitution result as a shell command...
что означает, что кавычки используются для отображения группы символов. То есть попробуйте echo MENDER_ARTIFACT_NAME = "release-6". Вы должны вручную добавить экранированные кавычки в оператор echo:
sed -r 's/^(.*)(release\-)([0-9]+)/echo "\1\\"\2$((\3+1))\\""/ge'
Когда вы используете решения, созданные другими людьми, лучше всего ссылаться на них. В данном случае вы взяли код из этого ответа: stackoverflow.com/a/14348899.