У меня есть большой файл, который содержит что-то вроде:

no = "33%"
no = "50%"

и я должен увеличить 33 & 50 на 1 так что результат будет

no = "34%"
no = "51%"

Я знаю, что это довольно сложная проблема, но если у вас есть идея, как ее решить, я буду рад вас услышать.

2 ответа2

0

Может быть возможно сделать это (с некоторыми ограничениями) с помощью подхода, основанного исключительно на регулярных выражениях, но такое решение будет очень неловким и несколько уродливым.  Тем не менее, это не сложно в 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 которая работает на вашей машине.

-1

Это не будет возможно с Regex ...

Если это разовая вещь, я бы просто включил Excel ... Сначала используйте Regex, чтобы вставить разделитель (например, табуляцию) вокруг числа, так что-то вроде этого

Find: (.*?)(\d+)(.*)

Replace: \1\t\2\t\3

Загрузите это в Excel, увеличьте числовой столбец, снова сохраните все как текст и найдите / удалите разделители.

Это немного глупый взлом / обходной путь, но если это будет один раз, это будет быстрее, чем научиться играть с неясными плагинами ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .