Я хотел бы увеличить номер сборки в файле как часть процесса сборки.
Сценарий предназначен для поиска .###'/* BUILD-NUMBER */, например:
console.info('Version 1.1.017'/* BUILD-NUMBER */);
Разберите 017, добавьте один, затем снова sprint. Это код, который у меня есть:
perl -pe "s~\.([0-9]+)'/\* BUILD-NUMBER \*/~(sprintf('.%03d%c/* BUILD-NUMBER */', $1, 39))~e" < $U > $T
39 должен соответствовать %c для печати апострофа ', потому что я не мог понять, как вставить его буквально. (Это входит в сценарий bash.)
В любом случае, когда я запускаю вышеуказанное, оно возвращается:
console.info('Version 1.1.001'/* BUILD-NUMBER */);
Итак, я думаю, что это не так. Я пробовал $0, $1, \g1 и т. д., Но он возвращает некоторые странные вещи. Нигде не видит 17.
Кроме того, будут ли ведущие нули в номере сборки заставлять perl интерпретировать строку как восьмеричную? (Причина использования 017 в качестве тестового примера, чтобы увидеть, возвращается ли он как 016 или 018.)
@Inian Почему вы пометили этот sed? Ни в коде, ни в вопросе нет даже упоминания sed. bash является релевантным тегом, потому что проблема вызвана цитированием оболочки и расширением параметров ($1).
@melpomene: Согласитесь, вы правы насчет $1 и проблемы цитирования. В общем, оба гарантируют, что тег должен быть общим для shell, а не полностью специфичным для bash. А вот $1 не заметил, а вот метка не помешает.





Ваша проблема вызвана использованием "..." для обертывания кода Perl в оболочке. Это заставит оболочку интерполировать свою переменную $1 в код еще до того, как Perl ее увидит.
Исправить:
perl -pe 's~\.([0-9]+)(?='\''/\* BUILD-NUMBER \*/)~sprintf ".%03d", $1 + 1~e'
Кстати, вот как вы вставляете ' в строку '...' в оболочке:
' - конец цитируемого раздела\' - буквальный ' (без обратной косой черты)' - перезапустить указанный разделЯ изменил ваше регулярное выражение, чтобы использовать упреждающий просмотр, чтобы не захватывать часть '/* BUILD-NUMBER */, что означает, что мне не нужно заменять ее обратно.
016 не будет интерпретироваться как восьмеричный. Восьмеричный формат используется только для литералов в исходном коде; в данных всегда используется десятичная дробь.
\x39 можно использовать вместо '\''. И более, и менее читабельные.
@ikegami Но только потому, что это в контексте конструкции Perl, заключенной в двойные кавычки. '\'', по крайней мере, несколько лучше, потому что он работает на уровне оболочки и производит настоящий ' (и потому что мне не нужно запоминать шестнадцатеричные коды для его использования).
Re "Но только потому, что это в контексте конструкции Perl, заключенной в двойные кавычки.", да это не общее решение. Но когда речь идет о программах на Perl, вы всегда можете избежать использования одинарных кавычек, используя q{}, \x39 или что-то еще.
Re "и потому что мне не нужно запоминать шестнадцатеричные коды, чтобы использовать его". Как я уже сказал, это не только делает код более читаемым (избегая беспорядка символов), но и делает его менее читаемым (за счет использования «магического числа»). Однако запомнить это довольно просто.
Если бы вы также могли опубликовать образец ввода, нам тоже было бы проще.