Найти номер и заменить + 1 - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть большой файл со списком объектов, которые имеют увеличивающуюся страницу # т.е.

[
{page: 1},
{page: 2},
{page: 3}
]

Я могу найти каждый экземпляр page: # с page: (\d) в ctrl + f искателе vscode.Как бы заменить каждое из этих чисел на # + 1?

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

Невозможно выполнить арифметику с регулярным выражением.Я использую LINQPad для выполнения этих небольших скриптов.Пример того, как я это сделаю, приведен ниже в программе на c #.

void Main()
{
    var basePath = @"C:\";

    // Get all files with extension .cs in the directory and all its subdirectories.
    foreach (var filePath in Directory.GetFiles(basePath, "*.cs", SearchOption.AllDirectories))
    {
        // Read the content of the file.
        var fileContent = File.ReadAllText(filePath);

        // Replace the content by using a named capture group.
        // The named capture group allows one to work with only a part of the regex match.
        var replacedContent = Regex.Replace(fileContent, @"page: (?<number>[0-9]+)", match => $"page: {int.Parse(match.Groups["number"].Value) + 1}");

        // Write the replaced content back to the file.
        File.WriteAllText(filePath, replacedContent);
    }
}

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

page: (?<number>[0-9]+)

page:  matches with "page: " literally.
(?<number> is the start of a named capture group called number. We can then use this group during replacement.
[0-9]+ matches a number between 0 and 9 one to infinite times. This is more specific than using \d as \d also matches other number characters.
The + makes it match more than on digit allowing for the number 10 and onwards.
) is the end of a named capture group.
0 голосов
/ 11 апреля 2019

Вы можете сделать это в Ruby следующим образом.

FileIn  = "in"
FileOut = "out"

Файл Давайте создадим образец файла (содержащий 37 символов).

File.write FileIn, "[\n{page: 1},\n{page: 2},\n{page: 33}\n]\n"
  #=> 37

Теперь мы можем прочитать входной файл FileIn, преобразовать его и записать в новый файл FileOut.

File.write(FileOut, File.read(FileIn).
     gsub(/\{page: (\d+)\}/) { "{page: #{$1.next}}" })

Давайте посмотрим, что будет написано.

puts File.read(FileOut)
[
{page: 2},
{page: 3},
{page: 34}
]

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

0 голосов
/ 11 апреля 2019

Это можно сделать довольно легко в vscode, используя одну из встроенных команд emmet:

Emmet: Increment by 1
  1. Используйте свое регулярное выражение, чтобы найти все page: \d+ в вашем файле.
  2. Ctrl - Shift - L для выбора всех этих вхождений.
  3. Запуск команды Emmet: Increment by 1.

Вот демоверсия:

Emmet:Increment buy 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...