Bash – Continue stringmanipulatie

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

Is er een manier om deze twee lijnen aan elkaar te lijmen tot een oneliner?

Answer

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

test:

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

scriptinhoud:

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

Reacties

  • Aangezien de twee regels nogal onderling uitwisselbaar zijn, is deze oplossing tot dusver de meest nette … Als de regels niet ' onderling uitwisselbaar zijn sed zal zeker nodig zijn, denk ik.

Antwoord

Je kunt niet nesten uitbreidingen in bash (noch in ksh, ash en andere shells behalve zsh). Dit is slechts een cosmetische beperking, aangezien je, zoals je illustreert, een tussenliggende uitdrukking kunt toewijzen aan een tijdelijke variabele. Het is een beetje vervelend voor oneliners, maar in scripts is het aantoonbaar beter voor de leesbaarheid.

Je zou je kunnen vermijden zing het externe hulpprogramma basename en gebruik in plaats daarvan een stringmanipulatieconstructie:

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

Hier komt het voor dat je herschrijf uw script naar plaats de opdrachtvervanging aan de buitenkant . Dat is geen algemeen fenomeen, en je krijgt ook niets anders dan een bepaald oneliner-gevoel.

Met Zsh, voor beter of slechter, kun je uitbreidingen nesten:

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

Of je zou de ingebouwde constructie van zsh kunnen gebruiken in plaats van basename:

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

Antwoord

Ik “zou gaan voor:

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

De tweede parameter voor basename is een achtervoegsel dat uit de bestandsnaam moet worden verwijderd (zie man basename)

Answer

Je zou een enkel sed commando kunnen gebruiken zoals in het volgende:

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

Answer

Met sed zou dit moeten werken:

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

(Dit beantwoordt uw vraag niet precies omdat ik het niet kan; ik weet niet zeker of het mogelijk is.)

Antwoord

The Bash constructies werken met variabelenamen , dus er is geen manier om een commando rechtstreeks in te sluiten. @sr_ “s benadering is een alternatief als je de extra fork niet erg vindt.

Answer

De regel

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

kan worden ingekort en draagbaarder gemaakt met

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *