Ich habe etwa 200 Dateinamen, aus denen ich Daten ziehen möchte. Das Format ist ungefähr so: Dateiname(120516.1108).mp3 Ich versuche, den Teil vor dem „(“ und auch den Teil vor dem „.“ zu ziehen. Nicht alle Dateien haben dieses Format, also ist das eine zusätzliche Herausforderung.
Die Ausgabe sollte lauten: „Dateiname“ „120516“
Ich möchte diesen Vorgang möglichst in Bash durchführen. Ich bin noch in der Lernphase und habe nur sehr wenig Erfahrung mit Bash. Alle Erklärungen zusammen mit Code sind herzlich willkommen.
Antwort1
„in Bash“, etwa:
re='^(.*)\(([0-9]+)\.[0-9]+\).*$'
Dann
for f in *.mp3; do
[[ $f =~ $re ]] && printf '"%s" "%s"\n' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
done
Antwort2
Wenn ich das richtig verstehe, sollte dieser Befehl funktionieren (wenn der Dateiname keine '(' und '.' enthält)
data=$(echo $file | cut -d"." -f1 | tr -d "(")
Teilen Sie sie in zwei Variablen auf:
filename=$(echo $file | cut -d"(" -f1)
number=$(echo $file | cut -d"(" -f2 | cut -d"." -f1)
Antwort3
VerwendenParametererweiterungKürzung.
case "$filename" in
*\(*.*\)*)
before_first_parenthesis=${filename%%\(*}
after_first_parenthesis=${filename#*\(}
before_dot=${after_first_parenthesis%%.*}
echo "$before_first_parenthesis" "$before_dot"
*) echo "does not match the format";;
esac