![Vorherige Befehle in bearbeiteten Befehl importieren](https://rvso.com/image/1481857/Vorherige%20Befehle%20in%20bearbeiteten%20Befehl%20importieren.png)
Ich spiele mit zsh, um die Bildänderungszeit entsprechend dem Exif-Attribut „Originaldatum/-uhrzeit“ zu ändern.
Dafür führe ich einen Befehl aus:
PDATE=$(exiftool -p '$DateTimeOriginal' $PIC | sed 's/[: ]//g') touch -t $(echo $PDATE | sed 's/\(..$\)/\.\1/') $PIC
Ich habe einige Bilder mit einem falschen „Originaldatum/-uhrzeit“-Wert erhalten, deshalb wurden diese Bilder nicht verarbeitet.
Ich arbeite also daran, das Datum aus dem Dateinamen des Bildes zu erhalten und habe
for i in `grep -E -o 'IMG\S+jpg' logfile`; do
dte=$(echo $i | grep -E -o '20.{13}' | tr -d '_');
touch -t $dte $i;
done
wobei die Protokolldatei eine Datei ist, die Exiftool-Meldungen mit falschen Arbitrierungswert usw. enthält.
Jetzt funktioniert der letzte Befehl des zweiten Snippets nicht, weil ich die Sed-Ersetzung wie im ersten Snippet vornehmen muss.
Meine Frage lautet: Wie kann ich im interaktiven zsh-vi-Modus auf den ersten Snippet im Verlauf zugreifen, ohne den Inhalt des aktuellen Befehls zu verlieren?
Ich stelle mir vor, den aktuellen Befehl in vi zu bearbeiten (wie ich es tun kann, wenn ich im zsh-vi-Steuermodus das Zeichen „v“ drücke), die Liste der Verlaufsbefehle anzuzeigen und einen davon auszuwählen, der dann in die Zeile darunter eingefügt wird.
Antwort1
Es gibtzsh-cmd-architektwurde speziell für das erstellt, was Sie beschreiben. Es zeigt Ihren aktuellen Befehl an, ermöglicht das Verschieben von Blöcken davon nach links und rechts und zeigt auch einen durchsuchbaren Verlauf an, aus dem Sie dort Befehlsblöcke auswählen können.
Antwort2
Sie verwenden zsh im vi-Modus.
Um Ihr Problem zu lösen, teilen wir das Problem in zwei Teile auf
1. Teil - Befehlsverlaufszeilen drucken, die einem Muster entsprechen
Dazu erstellen wir eine Datei ~/bin/history-print-regexp.sh
mit:
#!/bin/zsh
# command 'regular-expression' number-of-lines(counting from the end of the file)
nmbr=15
if [ "$#" -eq 2 ]; then
nmbr=$2
fi
if [ "$#" -eq 0 ]; then
echo "You need at least one argument"
echo "Usage command regexp outputlinesCount"
fi
#tac - reverse print , grep -E - use extended regexp, cut -d ';' use ; as delimiter
#and print second field (-f 2), uniq -u print only unique lines
tac ~/.histfile | grep -E $1 | cut -d ';' -f 2 | uniq -u | head -n $nmbr
Jetzt müssen wir es mit Ihrem aktuellen Befehl zum Laufen bringen. Dazu tun wir:
Im normalen zsh-vi-Modus drücken Sie die v
Taste zweimal und das vi-Fenster wird geöffnet.
In Ihrer ~/.vimrc Datei fügen Sie diese Funktion ein
function! ShowHistoryMatching(pattern)
10new
exe 'r!' . "history-print-regexp.sh " . a:pattern
call cursor(1,1)
endfunction
:cnoremap ch call ShowHistoryMatching
Die Verwendung dieses Skripts besteht darin, dass Sie, während Sie im zsh total vi-Editor sind, Ihren aktuellen Befehl bearbeiten, diesen drücken, :ch
der zu :call ShowHistoryMatching erweitert wird, diesem („pattern“) hinzufügen und die Eingabetaste drücken. Die Ergebnisse werden im Fenster oben geöffnet. Von dort aus können Sie einfach eine gewünschte Zeile in Ihr zweites Fenster kopieren.
C-w,q
schließt ein Fenster,
C-w,j
geht zum darunterliegenden Fenster.