Bash – Kontinuerlig strengmanipulation

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

Er der alligevel noget at lime disse to linjer sammen til en en-liner?

Svar

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

test:

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

scriptindhold:

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

Kommentarer

  • Da de to linjer er lidt udskiftelige, er denne løsning indtil videre den pæneste … Hvis linjerne ikke er ' t udskiftelige sed vil jeg helt sikkert have brug for.

Svar

Du kan ikke rede udvidelser i bash (heller ikke i ksh, aske og andre skaller bortset fra zsh). Dette er kun en kosmetisk begrænsning, da som du illustrerer, kan du tildele et mellemliggende udtryk til en midlertidig variabel. Det er lidt irriterende for one-liners, men i scripts er det uden tvivl bedre for læsbarhed.

Du kunne undgå dig syng det eksterne værktøj basename og brug en strengmanipulationskonstruktion i stedet:

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

Her sker det, at du kan omskriv dit script til sæt kommandosubstitutionen udefra . Det er ikke et generelt fænomen, og du får heller ikke noget andet end en bestemt følelse af en linie.

Zsh, på godt og ondt, giver dig mulighed for at rede udvidelser:

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

Eller du kan bruge zshs indbyggede konstruktion i stedet for basename:

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

Svar

Jeg ville gå efter:

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

Den anden parameter til basenavn er et suffiks, der skal fjernes fra filnavnet (se man basename)

Svar

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

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

Svar

Indeholder sed, dette skal gøre tricket:

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

(Dette svarer ikke nøjagtigt dit spørgsmål, for jeg kan ikke; er ikke sikker på, om det er muligt.)

Svar

Bash konstruerer arbejde med variabelnavne , så der er ingen måde at integrere en kommando direkte. @sr_s tilgang er et alternativ, hvis du ikke har noget imod den ekstra gaffel.

Svar

Linjen

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

kan afkortes og gøres mere bærbare med

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *