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

Не используя кавычки в echo $ var , вы подвергаете расширение как «разбиению», так и «расширению имени пути» (также известному как «подстановка» или « генерация имени файла ").

Это означает, что строка, содержащая [ (также * и ? ), будет расширена по правилам «раскрытия имени пути». В вашем случае это означает, что существует файл с именем, состоящим только из одного символа, с именем h .

Если вы процитируете расширение, «Расширение имени пути» не будет выполнено:

$ echo "$var"
[a-p]
1
06.07.2017, 10:58
1 ответ

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 или Solarisvi:обратные ссылки, \dв регулярных выражениях и несколько флагов -c.

  3. Поскольку Vim не предназначен для решения подобных проблем,здесь нам нужна явная опция «сохранить и выйти» (-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 pie idiom:

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

Это короче альтернативы sed -E, потому что регулярные выражения Perl даже более эффективны, чем расширенные RE POSIX.

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

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

1
27.01.2020, 23:45

Теги

Похожие вопросы