Замена и увеличение строки в bash

Это не так просто, как может показаться.

  1. Вам нужен поддомен stuff, чтобы можно было использовать адрес stuff.foo.com. Вы должны зарегистрировать его на своем DNS-сервере -, создав для него запись DNS. Иначе люди не смогут его найти.
  2. Затем в вашем Apache вам потребуется либо перенаправление с vps.foo.com/stuff.htmlна stuff.foo.com, либо вы можете переместить ресурсы прямо на stuff.foo.com. Но тогда вы не сможете связаться с ними по старому адресу.
0
11.07.2019, 18:59
3 ответа

Предполагая, что уровень патча всегда будет строкой из четырех цифр:

$ ver=1.2.0001
$ printf '%s\n' "$ver" | awk -F '.' '{ printf("%s.%s.%04d\n", $1, $2, $3 + 1) }'
1.2.0002

Здесь используется awkи интерпретируется версия как три поля, разделенные точками. Он печатает первые два поля как есть, но добавляет 1 к третьему полю и форматирует результат, используя%04d(заполненное нулем -четырехзначное десятичное число ).

Это сгенерирует 1.2.10000, если $verравно 1.2.9999.

Чтобы сохранить значение обратно в ver, используйте ver=$( printf... | awk... ).

1
28.01.2020, 02:29

Вы можете использовать perl, довольно мощный текстовый манипулятор:

perl -pi -e 's/(^ver="\d+)\.(\d+)\.(\d+)"/"$1.$2.". sprintf("%04d", $3+1). "\""/e' input

Это вызывает perl с тремя параметрами:

  • -p--авто -печать каждой строки ввода
  • -i--отредактируйте файл в -месте
  • -e--используйте следующий аргумент в качестве кода для выполнения

В коде сказано выполнять поиск и замену в каждой строке ввода; часть «поиск» будет соответствовать только строкам, которые:

  1. начинаются сver="
  2. с последующей одной или несколькими цифрами(\d+означает "совпадение цифр один или несколько раз")
  3. с последующей точкой .,который должен быть экранирован для правил регулярных выражений
  4. , за которым следует один или несколько символов, отличных от -точки
  5. после точки.
  6. , за которым следует один или несколько символов, отличных от -точки
  7. , за которым следует двойная -кавычка

Элементы #1 и #2 сгруппированы вместе в круглых скобках как текст замены $1; элемент #4 является текстом замены $2, а элемент #6 становится текстом замены $3. Прежде чем вернуть $3на место, мы отправляем его через форматированный оператор печати, который добавляет единицу к значению.

Поскольку при замене нам нужно выполнить код perl, нам нужна опция eв конце s///. Мы также должны добавить в конце двойную кавычку -, которая требуется как элемент #7.

Вы можете сузить или ослабить это регулярное выражение различными способами; возможно, вы могли бы потребовать, чтобы соответствующая строка «ver» была единственной вещью в строке, и в этом случае вы должны добавить $конец -из -привязки строки после двойной кавычки -в элементе #7.

1
28.01.2020, 02:29

Сbash:

$ ver="1.2.0001"
$ printf -v ver '%s.%04d' "${ver%.*}" "$((${ver##*.} + 1))"
$ echo "$ver"
1.2.0002
  • ${ver%.*}используется для получения префикса 1.2удаления шаблона суффикса.*
  • ${ver##*.}используется для получения части числа 0001удаление самого длинного шаблона префикса*.
  • printf -v ver...печатает префикс плюс .и увеличенное число, используя арифметику bash $((... + 1))и сохраняет результат обратно в переменную ver.
0
28.01.2020, 02:29

Теги

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