2010-11-18 13 views
0

Ich habe einen Befehl wie dies in meiner Geschichte (Linux-Bash-Shell):Substitution von historischem Shell-Befehl

1119 for dir in `ls -d MyMod.*`; \ 
    do echo $dir; \ 
svn copy --parents $dir $REPO/tags/MyMod_20101115/$dir -m"MyMod tag for 20101115"; \ 
done 

wo 1119 die Befehlsnummer ist.

(Beachten Sie, dass der Befehl in Wirklichkeit auf einer Linie alle ist und enthält keine \ Zeichen. Ich habe die, die gerade in der es auf die Seite passen, lassen sich hier)

Gibt es ein Einzeiler Sie können das oben von 20101115 bis 20101118 ändern (ein Tag des heutigen Datums darstellt). Natürlich könnten wir ein Skript dafür erstellen.

Dies ist keine Frage über SVN. Das obige Beispiel ist ein SVN-Beispiel, aber der Zweck der Frage besteht darin, zu wissen, wie man die Substitution vornimmt, zumal es in der History ist und ein for verwendet. Wir haben versucht, echo! 1119 mit sed zu mischen und bekommen nicht das gewünschte Ergebnis.

+0

Ich glaube, Sie suchen, wie bestimmte Zeile zu extrahieren aus die ~/.bash_history? – ajreal

+0

Ändern Sie die Zeile im Verlauf mit Ersetzung und führen Sie sie aus. Die Ausführung kann mit Xargs erfolgen, obwohl ich die Befehlsnummer entfernen müsste. Effektiv versuche ich^$ OLDDATE^$ NEWDATE, aber nicht für den letzten Befehl. Überrascht ist das schwieriger als ich es mir vorgestellt habe. – CashCow

Antwort

2

!1119:gs/20101115/20101118

See 'Geschichte Expansion' in Ihrem bash Handbuch

+0

Ich habe dies an einem etwas anderen Beispiel getestet (ich habe nur das Verzeichnis aufgelistet, das den Suchpfad geändert hat - da ich kein neues SVN-Tag mehr erstellen wollte) und es hat perfekt funktioniert! – CashCow

1

tail +1119 ~/.bash_history | head -1 | sed -e "s/20101115/20101118/g"

oder

history | tail +1119 | head -1 | awk -F" " '{print $3 $4}' | sed -e "s/$OLD/$NEW/g"

+1

~/.bash_history wird nicht in einer Bash-Sitzung aktualisiert. Ich schlage vor 'Geschichte | awk 'NR = 1119' | sed ... ' – Benoit

+0

Diese funktionieren nicht: das letztere gibt nur den gesamten Verlauf mit der Ersetzung aus. Selbst wenn ich es mit grep reduziere, bekomme ich immer den letzten Befehl, d. H. Den, den ich gerade anrufe, und ich bekomme immer noch das Präfix (1119), also kann ich es nicht aussprechen. – CashCow

1
fc -s 20101115=20101118 1119 
+0

Ich habe diese Lösung getestet und es funktioniert auch. Ich glaube nicht, dass ich 2 akzeptierte Antworten haben kann, aber ich habe dir +1 gegeben. – CashCow