fc
è il comando, incorporato nella shell bash, creato per modificare e rieseguire i comandi della cronologia.
È presente anche su CygWin e funziona su tutte le distribuzioni Linux su cui ho testato:
fc -s '\'='/' -1
Alcune spiegazioni
Qualche parola in più sul perché stai ricevendo "sostituzione fallita"
Sembra che per il s
modificatore non sia (ancora) implementata la sostituzione del carattere barra rovesciata \
, ovvero quella di fuga. Per essere sicuri dovremmo vedere il codice, ad esempio, della versione gnu dell'espansione della cronologia bash (ma c'era il comando sopra per ottenere quello che stavi cercando di fare ... quindi lo prendo pigro ....).
Alcune note:
Siamo indotti a pensare che funzionerà con ogni RegEx con cui ci troviamo a lavorare sed
, ma non è garantito. La barra rovesciata è il carattere di fuga dell'espansione e il problema è qui. Inoltre, il comportamento dell'espansione è correlato alle shopt
opzioni, quindi dovremmo iniziare a vedere caso per caso ...
Quando si incolla la stringa cd C:\Foo\Bar
nella shell bash, questa verrà espansa e verrà visualizzata come interprete come cd C:FooBar
; in questa forma verrà anche memorizzato nella $_
variabile interna.
Se invece hai incollato cd "C:\Foo\Bar"
o cd 'C:\Foo\Bar'
nella $_
variabile dovresti trovare C:\Foo\Bar
.
Poiché l'espansione della Cronologia viene eseguita immediatamente dopo la lettura di una riga completa, prima che la shell la spezzi in parole, potresti essere tentato di iniziare a usarla con un po 'di bashismo più o meno semplice, ad esempio, con una derivazione da (forse aggiungendo :p
o :q
, ""
, analisi e così via ...)
!!:0 ${_//\\/\/}
Questo è il momento per ricordare che non è sicuro iniziare a giocare con il percorso e i nomi dei file , soprattutto se provengono dagli Appunti di Windows (leggi in generale la pagina Perché non analizzare ls
? , è essenzialmente correlato alla possibilità di utilizzare la scheda, spazi e newline come caratteri corretti per i nomi dei file e quelli della directory ...).
Inoltre, quando si incolla un testo acquisito con il mouse , è possibile incollare anche uno spazio iniziale. Questo potrebbe evitare che il tuo comando finisca nella cronologia (dipende dalle opzioni della shell ...). In tal caso il tuo seguito !!
sarà un comando non controllato ... (vedi un esempio in un'altra risposta ).Questo è un rischio tangibile non necessario .
Conclusione
Le espansioni della cronologia introducono parole dall'elenco della cronologia nel flusso di input, semplificando la ripetizione dei comandi, inserendo gli argomenti di un comando precedente nella riga di input corrente o correggendo rapidamente gli errori nei comandi precedenti.
Se non è facile, comincio a pensare che stiamo facendo qualcosa di sbagliato ;-)
Ad nauseam: un piccolo esperimento
Ho abilitato histverify
nella shell quindi ...
shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A
poi premo Entere come espansione verificata trovo
echo D:\Foo\Bar {1,2}A
poi premo di Enternuovo ed echeggia
D:FooBar 1A 2A
Questo sembra indicare che substitution failed
viene generato nell'espansione della storia elaborata prima dell'espansione Brace , quindi prima di tutto , e sembra confermare che il s
modificatore della storia non ha (ancora) elaborato la sostituzione del \
personaggio come una vera regex. ..
cd 'C:\foo\bar'