Может быть возможно сделать это (с некоторыми ограничениями) с помощью подхода, основанного исключительно на регулярных выражениях, но такое решение будет очень неловким и несколько уродливым.
Тем не менее, это не сложно в awk
:
awk '
{
n=0
if ($0 ~ /no = "[0-9]+%"/) {
n = split($0, part, /"/)
if (n == 3) print part[1] "\"" part[2]+1 "%\"" part[3]
}
if (n != 3) print
}'
(Первый) оператор if
проверяет, содержит ли строка ввода символы no = "
, за которыми следуют одна или несколько цифр, а затем %"
.
(Если вы хотите сопоставить только в начале строки, добавьте ^
между первым /
и no
.
Если вы хотите сопоставить только в конце строки, добавьте $
между %"
и вторым /
.)
Затем мы split
строку на кавычки.
Переменная n
получает количество частей; для no = "33%"
, счетчик равен 3, а части - no =
33%
и пустая строка (потому что после второй нет ничего "
).
(Обратите внимание, что кавычки не появляются в деталях, потому что они являются разделителями.)
part[2]+1
будет иметь значение 34
, потому что awk
будет игнорировать %
после 33
, и поэтому оператор print
соединяет части строки вместе, причем число увеличивается на единицу.
Как указано выше, этот скрипт разрешает другие вещи в строке до и после числа, но они могут не содержать кавычек.
Например,
The quick brown fox no = "33%" What did the bird say?
jumps over the lazy dog. no = "50%" Quoth the raven, "Nevermore."
будет преобразован в
The quick brown fox no = "34%" What did the bird say?
jumps over the lazy dog. no = "50%" Quoth the raven, "Nevermore."
Если строка не содержит no = "number%"
, она не войдет в блок if
и достигнет дна с n
равным 0.
Если он не содержит ни одного no = "number%"
но имеет дополнительные кавычки, то это будет , if
блок ввести, и n
будет установлено равным количеству кавычек плюс один.
В любом случае, if (n != 3) print
приведет к тому, что строка ввода будет записана без изменений.
awk
- это стандартная программа для Unix, Linux и других Unix-подобных систем.
(Я тестировал этот сценарий с --posix
, поэтому считаю, что он не зависит от каких-либо расширений GNU.)
Если у вас нет доступа к полноценной Unix-подобной машине, я предлагаю вам установить Cygwin или просто найти версию awk
которая работает на вашей машине.