Краткий ответ: встроенная команда 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 (пока) не обрабатывал замену символа \ как настоящее регулярное выражение ...