
Ich habe eine Reihe von Dateien, die programmgesteuert umbenannt werden sollten, damit sie für die Anwendung verständlich sind.
Ich muss vom Ende bis zum ersten _ abschneiden und es durch einen Punkt (.) ersetzen.
Da ich weder die Länge des Dateinamens noch die Anzahl der _ im Dateinamen im Voraus kenne, haben Sie irgendeine Idee über awk/sed/cut?
Antwort1
for F in *_*; do echo mv -- "${F}" "${F%_*}.${F##*_}"; done
Wenn die Ausgabe korrekt aussieht, entfernen Sie den echo
obigen Befehl.
Der Trick besteht darin, dass ${F%_*}
last entfernt wird _26
und ${F##*_}
alles vor dem letzten entfernt wird _
. Probieren Sie diese Befehle aus, um zu sehen, wie es funktioniert. Das Trennzeichen ist jetzt :
:
echo "${PATH}"
echo "${PATH%:*}"
echo "${PATH##*:}"
echo "${PATH%:*}_${PATH##*:}"
Antwort2
Verwenden vonsed
for file in *_*
do
echo mv $file $( sed 's/\(.*\)_/\1\./' <<< $file)
done
Entfernen Sie es echo
, wenn Sie zufrieden sind.
Antwort3
Sie können den letzten Block durch ersetzen sed
, indem Sie die Zeilenendemarkierung ( $
) verwenden.
#/bin/bash
for file in *_* ; do
#any alphanumeric string as suffix
mv $file $( sed 's/_\([A-Za-z0-9]\{1,\}\)$/.\1/' <<< $file )
#alternatively numbers only as in given input sample
mv $file $( sed 's/_\([0-9]\{1,\}\)$/.\1/' <<< $file )
done
Soweit ich weiß, ist der \{1,\}
Teil „eins oder mehrere“ in der vorhergehenden Liste GNU sed
– aber ich bin mir bezüglich dieser Einschränkung nicht 100 % sicher.