Краткий ответ: встроенная команда fc
(fix) bash
fc
- это команда, встроенная в оболочку bash, предназначенная для редактирования и повторного выполнения команд истории.
Он также присутствует в CygWin и работает во всех дистрибутивах Linux, на которых я тестировал:
fc -s '\'='/' -1
Некоторые объяснения
fc
- встроенная команда bash для вывода, редактирования или повторного выполнения команд из списка истории.
-1
примет последнюю команду в истории. Обратите внимание, что даже !!
определяется (читай из man bash
) как
!! Refer to the previous command. This is a synonym for
! -1 '.
-s
заменить шаблон на другой. На этот раз из help fc
(встроенная команда, так что help
):
В формате `fc -s [pat = rep ...] [command] 'COMMAND повторно выполняется после выполнения замены OLD = NEW.
Хорошо, они имеют в виду pat=rep
вместо OLD=NEW
...
- Шаблоны будут читаться оболочкой, поэтому мы должны защищать их с помощью кавычек:
'\'
и '/'
.
Несколько слов о том, почему вы получаете "замена не удалась"
Кажется, что для модификатора s
(пока) не реализована подстановка символа обратной косой черты \
, то есть escape. Чтобы быть уверенным, мы должны увидеть код, например, версии gnu расширения истории bash (но была указанная выше команда, чтобы получить то, что вы пытались сделать ... поэтому я считаю это ленивым....)
Некоторые заметки:
Мы склонны думать, что он будет работать каждый RegEx, который мы находим, работая с sed
, но это не гарантируется. Обратная косая черта является escape-символом расширения, и проблема здесь. Кроме того, поведение расширения связано с опциями shopt
, поэтому мы должны начать видеть в каждом конкретном случае ...
Когда вы вставите строку cd C:\Foo\Bar
в оболочку bash, она развернется и отобразится для интерпретатора как cd C:FooBar
; в этом виде он также будет храниться во внутренней переменной $_
.
Если вы вместо этого вставили cd "C:\Foo\Bar"
или cd 'C:\Foo\Bar'
в переменную $_
вы должны найти C:\Foo\Bar
.
Так как расширение истории выполняются сразу же после полной линии читать, прежде чем оболочка разбивает его на слова, вы можете захотеть , чтобы начать использовать его с некоторыми bashism более или менее простым, например, с каким - то выводом из (возможно :p
или :q
, ""
, разбор и так далее ...)
!!:0 ${_//\\/\/}
Это момент, который нужно помнить, что небезопасно начинать играть с путями и именами файлов , особенно если они приходят из буфера обмена Windows (читайте в общем на странице Почему бы не разобрать ls
?, Это по сути связано с возможностью использовать tab , пробелы и переводы строк как правильные символы для имен файлов и каталогов ...).
Более того, когда вы вставляете текст, захваченный мышью , вы также можете вставить начальный пробел. Это может предотвратить завершение вашей команды в истории (это зависит от параметров оболочки ...). Если так, то ваш следующий !!
будет неуправляемой командой ... (см. пример в другом ответе). Это ненужный ощутимый риск .
Заключение
Расширения истории вводят слова из списка истории во входной поток, что позволяет легко повторять команды, вставлять аргументы предыдущей команды в текущую строку ввода или быстро исправлять ошибки в предыдущих командах.
Если это не так просто, я начинаю думать, что мы делаем что-то не так ;-)
До тошноты: небольшой эксперимент
Я включил histverify
в оболочке ...
shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A
затем я нажимаю Enter и в качестве проверенного расширения нахожу
echo D:\Foo\Bar {1,2}A
затем я нажимаю Enter еще раз, и он эхом
D:FooBar 1A 2A
Похоже, это указывает на то, что substitution failed
сгенерирована в расширении истории, обработанном до расширения Brace, поэтому, во- первых, и это подтверждает, что модификатор истории s
(пока) не обрабатывал замену символа \
как настоящее регулярное выражение ...