Bash – Continuing String Manipulation

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

Există oricum să lipim aceste două linii împreună într-un singur liner?

Răspuns

FILE=$(basename "${1/%.jpeg/.jpg}") a funcționat pentru mine.

test:

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

conținut script:

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

Comentarii

  • Deoarece cele două linii sunt cam interschimbabile, această soluție este până acum cea mai ordonată … Dacă liniile nu sunt ' t interschimbabile sed va fi cu siguranță nevoie, cred.

Răspuns

Nu poți să cuibărești expansiuni în bash (nici în ksh, cenușă și alte cochilii în afară de zsh). Aceasta este doar o limitare cosmetică, deoarece așa cum ilustrați, puteți atribui o expresie intermediară unei variabile temporare. Este puțin enervant pentru un singur liner, dar în scripturi este, probabil, mai bine pentru lizibilitate.

Ați putea evita u cântați utilitarul extern basename și utilizați în schimb o construcție de manipulare a șirurilor:

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

Aici se întâmplă că puteți rescrieți scriptul pentru a pune înlocuirea comenzii în exterior . Acest lucru nu este un fenomen general și nici nu obțineți altceva decât un anumit sentiment de linie.

Zsh, în bine sau în rău, vă permite să cuibăriți expansiuni:

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

Sau puteți utiliza construcția încorporată a zsh în loc de basename:

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

Răspuns

Aș alege:

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

Al doilea parametru pentru numele de bază este un sufix care trebuie eliminat din numele fișierului (vezi man basename)

Răspuns

Puteți utiliza o singură comandă sed ca în cele ce urmează:

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

Răspuns

Incorporând sed, acest lucru ar trebui să facă trucul:

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

(Acest lucru nu răspunde exact la întrebarea dvs., deoarece nu pot; nu sunt sigur dacă este posibil.)

Răspunde

The Bash construiește funcționează cu nume de variabile , deci nu există nicio modalitate de a încorpora o comandă direct. Abordarea @sr_ este o alternativă dacă nu vă deranjează furculița suplimentară.

Răspuns

Linia

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

poate fi scurtat și făcut mai portabil cu

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *