(solved) Bräuchte Hilfe zu sed

  • Hi,


    Hab hier mp3s liegen mit z.b: Bezeichnung 04 Hum Along And Dance.mp3, diese möchte ich in nem Script zu wav wandeln und dann
    als Audio-CD brennen (is ja soweit auch kein Problem) aber ich möchte bei der Wandlung zu wav gleich den Titel übernehmen
    und den dabei auch so umwandeln das;
    04.Hum_Along_And_Dance.wav
    rauskommt.


    Problem hab ich nur dabei das ich nach der Zahl 04 (dies kann aber manchmal auch nur ne einstellige Zahl sein also z.b: 4
    das Leerzeichen zu nem Punkt wandeln will - wollte das mit sed erledigen hab aber nix wirkliches hinbekommen.
    Im folgenden Code sieht man (nur die Zeilen mit sed (sind derweil auskommentiert)) was ich so versucht habe.

    Code
    outfile="$(basename "$track" .mp3).wav"
                	outfile="${outfile// /_}"
                	outfile="$(echo $outfile | sed 's/\([^[0-9].\)\_/\1./')"
                	#outfile="$(echo $outfile | sed 's/\([0-9]*\)\_/\1./')"
                	#outfile="$(echo $outfile | sed 's/\([0-9]\{1,3\}\)\_\(*\{2\}\)/\1.\2/')"
                	#outfile="$(echo $outfile | sed 's/\([^0-9])\_/./')"


    Die ersten beiden Zeilen passen damit krieg ich den Titel und die Endung wav statt mp3 und alle Files kriegen bei den Leerzeichen erstmal Unterstriche verpasst
    (läuft in ner Schleife),
    aber ich schaffs nicht das nur wenn ein File überhaupt mit Zahlen anfängt und danach ein Leerzeichen kommt dieses erste Leerzeichen in nen Punkt zu verwandeln.
    Hatte es bei meinen Versuchen zwar soweit geschafft das alle Leerzeichen nen Punkt bekommen oder auch mal das um beim Beispiel zu bleiben der Punkt
    so war 04_Hum_Along_And.Dance.wav also vor dem letzten Wort vor der Endung oder einmal sogar das der Punkt wirklich an der richtigen Stelle war also so 04.Hum_Along_And_Dance.wav
    jedoch wurden weitere Files dann auch mit nem Punkt gesegnet obwohl die gar nicht mit ner Zahl anfingen also z.b: dann Und.heute_nicht.wav.


    Also ich gebs zu bei sed tu ich mir schon etwas schwer (hab aber bislang auch immer versucht sed zu vermeiden wenns ging)
    aber wie auch immer, ich frag deshalb mal hier um HIlfe denn ich hab damit gestern mehrere Stunden verbracht und das was ich haben wollte
    jedoch nicht erreicht.



    Gruss
    Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

    Einmal editiert, zuletzt von Bert ()

  • Meinst du so?

    Code
    for file in "04 Hum Along And Dance.mp3" "Und heute nicht.mp3"; do
      outfile=$(sed 's/\([[:digit:]]\+\)\(\ \)\(.*\)/\1.\3/;s/\.mp3$/.wav/;s/\ /_/g' <<< "$file")
      echo $outfile
    done
    04.Hum_Along_And_Dance.wav
    Und_heute_nicht.wav

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Hi seahawk1986,


    Ja so in etwa stell ich mir das vor, du machst das also gleich alles mit sed in deinem Code.
    Klappt das dann auch wenn ich z.b: ein File habe mit Bezeichnung 04 Hum Along and 23 dance.mp3
    (is jetzt aus der Luft gegriffen das Beispiel) aber ich meine das dann nach 23 kein Punkt ist sondern ein Unterstrich ist gewollt.
    Also so dann 04.Hum_Along_and_ 23_dance.wav ?
    Wenn ja wär das dann genau das was ich suche.


    Die ganze Passage hier sieht einstweilen so aus um dies geht;


    Die BURNLIST is halt ne Variable zu ner Playlist (genau ne burnlist.m3u) in der entweder wavs oder mp3s drinnen stehen können.



    Gruss
    Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

  • Klappt das dann auch wenn ich z.b: ein File habe mit Bezeichnung 04 Hum Along and 23 dance.mp3
    (is jetzt aus der Luft gegriffen das Beispiel) aber ich meine das dann nach 23 kein Punkt ist sondern ein Unterstrich ist gewollt.
    Also so dann 04.Hum_Along_and_ 23_dance.wav ?


    Wo ist da jetzt das Problem das einfach auszuprobieren?

    Code
    ~$ file="04 Hum Along and 23 dance.mp3"
    ~$ sed 's/\([[:digit:]]\+\)\(\ \)\(.*\)/\1.\3/;s/\.mp3$/.wav/;s/\ /_/g' <<< "$file"
    04.Hum_Along_and_23_dance.wav

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Kein Problem - hatte noch keine Zeit dazu, aber jetzt...


    Gruss
    Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

  • Hi,


    Ja passt seahawk1986 - Danke.
    Die Section im case nur erstmal bzgl. $MP3 schaut dann insgesammt so aus;


    Code
    echo -e "\nKonvertiere MP3s zu WAVs ...\n$TEMPDIR\n"
                	while read track ; do
         	           	outfile="$(basename "$track" .mp3).wav"
         	           	outfile="$(echo $outfile | sed 's/\([[:digit:]]\+\)\(\ \)\(.*\)/\1.\3/;s/\.mp3$/.wav/;s/\ /_/g')"
         	           	$NICE -n 19 $LAME --decode $track "$TEMPDIR/$outfile"
                	done < $BURNLIST


    Aber lesen kann ich diese sed Zeile (jedenfalls derzeit) nicht :D hoffe ich blick da mal auch noch durch



    Gruss
    Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

  • Aber lesen kann ich diese sed Zeile (jedenfalls derzeit) nicht hoffe ich blick da mal auch noch durch


    Der sed-Befehl selbst ist eigentlich nicht schlimm, das sind einfach drei Ersetzungen, die durch Strichpunkte getrennt hintereinander gesetzt sind:

    Code
    's/\([[:digit:]]\+\)\(\ \)\(.*\)/\1.\3/ # Wenn du mindestens eine Ziffer gefolgt von einem Leerzeichen findest, ersetze das Leerzeichen durch einen Punk.
    # das kann man auch noch schöner schreiben, indem man die Gruppe für das Leerzeichen weglässt und explizit angibt, dass die Zahl am Anfang der Zeile stehen soll:
    's/^\([[:digit:]]\+\)\ \(.*\)$/\1.\2/'
    's/\.mp3$/.wav/' # Ersetze die Zeichenfolge .mp3 am Ende der Zeile durch .wav
    's/\ /_/g' # Ersetze die Leerzeichen durch Unterstriche


    Mit sed -E wird mann noch ein paar Backslashes los:

    Code
    for file in "04 Hum Along and 23 dance.mp3"  "04 Hum Along And Dance.mp3" "Und heute nicht.mp3"; do
      outfile=$(sed -E 's/^([[:digit:]]+)\ (.*)$/\1.\2/;s/\.mp3$/.wav/;s/\ /_/g' <<< $file)
      echo $outfile
    done
    04.Hum_Along_and_23_dance.wav
    04.Hum_Along_And_Dance.wav
    Und_heute_nicht.wav

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Hi Seahawk1986,


    Danke für die Erklärungen - nun blick ich ein bisschen durch :]
    Werd mich in Zukunft nicht mehr vor sed drücken sondern mich lieber ein bisschen mehr damit befassen.
    Is ja schon super was damit so alles möglich ist.



    Gruss
    Bert

    Hardware: Intel Core i9-9900K, ASUS ROG Maximus XI Hero, MSI GeForce GTX 1050 Ti (vdpau), Dvbsky S952 V3 mit 2X DVB-S2 Tuner
    Multibootsystem (yavdr-ansible auf Ubuntu-20.04, Kubuntu-20.04 Focal Fossa, Win10)
    yavdr-ansible, Ausgabe über Nvidia vdpau

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!