Не используя кавычки в echo $ var
, вы подвергаете расширение как «разбиению», так и «расширению имени пути» (также известному как «подстановка» или « генерация имени файла ").
Это означает, что строка, содержащая [
(также *
и ?
), будет расширена по правилам «раскрытия имени пути». В вашем случае это означает, что существует файл с именем, состоящим только из одного символа, с именем h
.
Если вы процитируете расширение, «Расширение имени пути» не будет выполнено:
$ echo "$var"
[a-p]
Vim — не лучший способ сделать это, но это возможно:
$ vim -c '%s/^\(VARIABLE=\)\d\+/\13/' -c wq The_Generator.c
%s
означает «глобальный поиск и замена» в Vi. Шаблон поиска ищет строку, начинающуюся с VARIABLE=
, за которой следует одна или несколько цифр (\d+
), затем она заменяет цифру (с )на 3
, новое значение переменной, которую я выбрал для ради примера здесь. Часть VARIABLE=
помещается обратно в строку с обратной ссылкой\1
.
Здесь есть несколько слабых мест, которые делают это неоптимальным:
Vim — довольно тяжелая программа для такой простой задачи. Обратите внимание, что при этом вы получаете краткую вспышку полноэкранного -интерфейса vi
. Это расточительно; мы можем сделать лучше.
Vim не так широко используется, как представленные ниже альтернативы, и мы используем как минимум три функции Vim, которые вряд ли будут существовать в более традиционных вариантах Vi, таких как Berkeley nvi или Solarisvi
:обратные ссылки, \d
в регулярных выражениях и несколько флагов -c
.
Поскольку 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.