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

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

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

#!/bin/bash clear vim The_Generator.c (This is hopefully where I modify the The_Generator.c file). -c 'wq' 

  • Vim: присоедините линии, заменив ^ M
  • Vim: поддержка мыши потеряна после использования netrw в xterm
  • Vim приостанавливается случайным образом в течение минуты или около того за раз
  • Укажите имя пользователя при использовании vim с scp
  • VIM как c ++ IDE - автозаполнение
  • Сопоставление слов, содержащих символы за пределами a-zA-Z
  • Как обновить дату в файле, если применимо, и прирастить последнюю цифру на единицу, если вы записываете в файл с помощью Vim?
  • Мой терминал чистый белый // удаление вещей, которые spf13 сделал с моим Ubuntu
  • 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.

    Interesting Posts

    Как я могу подавить пространство между сгенерированными аргументами во время расширения фигурной скобки?

    Устройство Usb-ethernet

    сообщение «done» после того, как & -команда не отображается сразу же, но после действия пользователя. Зачем?

    dd над smb для переформатирования ntfs как ext3

    castnow – EADDRINUSE ::: 4100

    Solaris: найдите день последнего понедельника, вторника, … воскресенье с помощью сценария оболочки

    Копирование большого файла вызывает чрезмерный обмен

    Как найти буфер обмена по умолчанию в debian-mate?

    Автоматическая настройка ширины окна в tmux

    Как изменить конфигурацию hotspot для Network Manager?

    Как скомпилировать linux-версию ядра 3.16.1 для запуска в Slackware 14.1?

    Удалите определенные объекты из плоской базы данных файлов

    Подключение Telnet к несуществующему адресу

    Мониторинг информации заголовка HTTP-сервера исходящего сервера?

    Как искать файлы по размеру и расширению?

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