Bash – Kontinuerlig strengmanipulering

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

Er det allikevel å lime disse to linjene sammen til en en-liner?

Svar

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

test:

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

skriptinnhold:

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

Kommentarer

  • Siden de to linjene er ganske utskiftbare, er denne løsningen så langt den fineste … Hvis linjene ikke er ' t utskiftbare sed vil absolutt være nødvendig antar jeg.

Svar

Du kan ikke rede utvidelser i bash (heller ikke i ksh, aske og andre skall bortsett fra zsh). Dette er bare en kosmetisk begrensning, siden du som illustrerer kan tildele et mellomuttrykk til en midlertidig variabel. Det er litt irriterende for en-liners, men i skript er det uten tvil bedre for lesbarhet.

Du kan unngå deg syng det eksterne verktøyet basename og bruk en strengmanipulasjonskonstruksjon i stedet:

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

Her skjer det at du kan skriv om skriptet ditt til legg kommandosubstitusjonen på utsiden . Det er ikke et generelt fenomen, og du får heller ikke noe annet enn en viss følelse av en linje.

Zsh, på godt og vondt, lar deg hekke utvidelser:

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

Eller du kan bruke zsh «s innebygde konstruksjon i stedet for basename:

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

Svar

Jeg vil gå for:

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

Den andre parameteren til basenavn er et suffiks som skal fjernes fra filnavnet (se man basename)

Svar

Du kan bruke en enkelt sed -kommando som i følgende:

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

Svar

Inkluderer sed, dette skal gjøre susen:

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

(Dette svarer ikke nøyaktig på spørsmålet ditt fordi jeg ikke kan; er usikker på om det er mulig.)

Svar

The Bash konstruerer arbeid med variabelnavn , så det er ingen måte å bygge inn en kommando direkte. @sr_s tilnærming er et alternativ hvis du ikke har noe imot den ekstra gaffelen.

Svar

Linjen

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

kan forkortes og gjøres mer bærbart med

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *