Изменение числового значения в файле с помощью Vim из сценария

Мне нужно изменить числовое значение переменной, хранящейся в текстовом файле из командной строки.

Я попытался создать скрипт с Bash, но только добрался до этого:

  • Переместить файл, но только если он закрыт
  • Обнаруживать, если переменная пуста
  • Vim: Создание XML-текста «довольно»
  • Проверка орфографии в vim
  • Shell: как использовать 2 переменные с условием
  • Bash regex, строка соответствия из двух строк
  • #!/bin/bash clear vim The_Generator.c (This is hopefully where I modify the The_Generator.c file). -c 'wq' 

  • Выберите интерпретатор после запуска скрипта, например if / else внутри hashbang
  • Команда, которая генерирует как стандартную ошибку, так и вывод
  • Как vim крадет файлы, принадлежащие root?
  • Vim: сводка кода на питоне не отличается от кода C / C ++
  • Улучшение скорости выполнения сценария яркости экрана
  • Использование части поля в awk
  • One Solution collect form web for “Изменение числового значения в файле с помощью Vim из сценария”

    Vim – это не лучший способ сделать это, но это возможно:

     $ vim -c '%s/^\(VARIABLE=\)\d\+/\13/' -c wq The_Generator.c 

    %s означает «поиск и замена в глобальном масштабе» в Vi. Шаблон поиска ищет строку, начинающуюся с VARIABLE= за которой следует одна или несколько цифр ( \d+ ), затем она заменяет цифру (цифры) на 3 , новое значение переменной, которую я выбрал для примера здесь , Часть VARIABLE= возвращается в строку с \1 обратным отношением .

    Здесь есть несколько слабых сторон, которые делают это субоптимальным:

    1. Vim – довольно тяжелая программа для простой задачи, подобной этой. Обратите внимание, что при этом вы получаете кратковременную вспышку интерфейса полного экрана vi . Это расточительно; мы можем сделать лучше.

    2. Vim не так широко распространен, как альтернативы ниже, и мы используем по крайней мере три функции Vim, которые вряд ли будут существовать в более традиционных вкусах Vi, таких как Berkeley nvi или Solaris vi : обратные ссылки, \d в регулярных выражениях , и несколько -c флаги.

    3. Поскольку Vim не ориентирован на эту проблему, нам нужна явная опция «save and exit» здесь ( -c wq ), которая более кратко выражена в альтернативах ниже.

    Более эффективным и более портативным вариантом является использование sed :

     $ sed -i -e 's/^\(VARIABLE=\)[0-9][0-9]*/\13/' The_Generator.c 

    Если вы находитесь в системе, где вы можете использовать расширенные регулярные выражения POSIX в sed через -E , вы можете сделать команду короче, чем эквивалент Vim:

     $ sed -E -i -e 's/^(VARIABLE=)[0-9]+/\13/' The_Generator.c 

    Это позволит нам сбросить несколько обратных косых черт и выразить бит «один или несколько цифр» более компактно.

    Если эффективность не имеет первостепенного значения, вы можете получить более выразительную силу с помощью идиомы Perl :

     $ perl -pi -e 's/^(VARIABLE=)\d+/${1}3/' The_Generator.c 

    Он короче, чем альтернатива sed -E поскольку регулярные выражения Perl еще более мощны, чем расширенные REOS POSIX.

    Самая большая разница здесь в том, как Perl обрабатывает обратные ссылки. Обычно вы $NUM вместо синтаксиса $NUM вместо \DIGIT , но здесь мы помещаем число в фигурные скобки, чтобы отделить его от заменяющего текста, так как это также число. Без скобок, Perl пойдет искать backreference # 13, не найдет подходящий текст и, следовательно, не сможет делать то, что вы хотите.

    Некоторым людям нравится Awk для такого рода вещей, но я не смог придумать выражение, которое потянуло его собственный вес, будучи короче, чем опция sed , будучи быстрее, чем параметр Perl.

    Linux и Unix - лучшая ОС в мире.