So teilen Sie einen Dateinamen an einem angegebenen Trennzeichen

So teilen Sie einen Dateinamen an einem angegebenen Trennzeichen

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

verwandte Informationen