Bash – Kontinuierliche String-Manipulation

#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}" 

Gibt es überhaupt eine Möglichkeit, diese beiden Linien zu einem Einzeiler zusammenzukleben?

Antwort

FILE=$(basename "${1/%.jpeg/.jpg}") hat bei mir funktioniert.

Test:

bash-$ ./test.sh /tmp/foo.jpeg foo.jpg 

Skriptinhalt:

bash-$ cat test.sh #!/usr/bin/bash FILE=$(basename "${1/%.jpeg/.jpg}") echo "$FILE" 

Kommentare

  • Da die beiden Zeilen irgendwie austauschbar sind, ist diese Lösung bisher die sauberste … Wenn die Zeilen nicht ' nicht austauschbar sind sed wird definitiv benötigt, denke ich.

Antwort

Sie können nicht nisten Erweiterungen in bash (noch in ksh, ash und anderen Schalen außer zsh). Dies ist nur eine kosmetische Einschränkung, da Sie, wie Sie veranschaulichen, einer temporären Variablen einen Zwischenausdruck zuweisen können. Es ist ein wenig ärgerlich für Einzeiler, aber in Skripten ist es wohl besser für die Lesbarkeit.

Sie könnten u vermeiden Singen Sie das externe Dienstprogramm basename und verwenden Sie stattdessen ein Konstrukt zur Manipulation von Zeichenfolgen:

FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}" 

Hier können Sie dies Schreiben Sie Ihr Skript neu in und setzen Sie die Befehlsersetzung nach außen . Dies ist weder ein allgemeines Phänomen, noch gewinnen Sie etwas anderes als ein bestimmtes Einzeiler-Gefühl.

Zsh, zum Guten oder zum Schlechten, lässt Sie Erweiterungen verschachteln:

FILE=${$(basename $1)/%.jpeg/.jpg} # using basename FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting 

Oder Sie können das integrierte Konstrukt von zsh anstelle von basename verwenden:

FILE=${${1:t}/%.jpeg/.jpg} 

Antwort

Ich würde mich für Folgendes entscheiden:

FILE=$(basename $1 .jpeg).jpg 

Der zweite Parameter für den Basisnamen ist ein Suffix, das aus dem Dateinamen entfernt werden soll (siehe man basename).

Antwort

Sie können einen einzelnen sed -Befehl wie folgt verwenden:

FILE=$(sed "s/.*\///;s/\.jpeg$/.jpg/" <<<"$1") 

Antwort

Mit sed sollte dies den Trick tun:

FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)" 

(Dies beantwortet Ihre Frage nicht genau, da ich nicht sicher bin, ob dies möglich ist.)

Antwort

Der Bash -Konstrukte arbeiten mit Variablennamen , daher gibt es keine Möglichkeit, einen Befehl direkt einzubetten. Der Ansatz von @sr_ ist eine Alternative, wenn Sie die zusätzliche Gabel nicht stören.

Antwort

Die Zeile

FILE=$(basename "${1/%.jpeg/.jpg}") 

kann mit

FILE=$(basename "${1%.jpeg}.jpg") 

verkürzt und portabler gemacht werden

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.