Bash – kontinuerlig strängmanipulation

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

Finns det någonstans att limma dessa två rader ihop till en enfodrad?

Svar

FILE=$(basename "${1/%.jpeg/.jpg}") fungerade för mig.

test:

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

skriptinnehåll:

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

Kommentarer

  • Eftersom de två raderna är ganska utbytbara är den här lösningen hittills den snyggaste … Om raderna inte är ' t utbytbara sed kommer definitivt att behövas antar jag.

Svar

Du kan inte bo utvidgningar i bash (inte heller i ksh, ask och andra skal förutom zsh). Detta är bara en kosmetisk begränsning, eftersom du som illustrerar kan tilldela ett mellanuttryck till en tillfällig variabel. Det är lite irriterande för en-liners, men i skript är det förmodligen bättre för läsbarheten.

Du kan undvika dig sjunga det externa verktyget basename och använd en strängmanipulationskonstruktion istället:

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

Här händer det att du kan skriv om ditt skript för att placera kommandosubstitutionen på utsidan . Det är inte ett allmänt fenomen, och du får inte heller något annat än en viss känsla med en liner.

Zsh, på gott och ont, låter dig bygga utvidgningar:

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

Eller så kan du använda zsh ”s inbyggda konstruktion istället för basename:

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

Svar

Jag skulle gå för:

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

Den andra parametern till basnamn är ett suffix som ska tas bort från filnamnet (se man basename)

Svar

Du kan använda ett enda sed -kommando som i följande:

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

Svar

Inkluderar sed, detta borde göra tricket:

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

(Detta svarar inte exakt på din fråga för jag kan inte; inte säker på om det är möjligt.)

Svar

Bash konstruerar arbete med variabelnamn , så det finns inget sätt att bädda in ett kommando direkt. @sr_s tillvägagångssätt är ett alternativ om du inte har något emot den extra gaffeln.

Svar

Raden

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

kan förkortas och göras mer portabelt med

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *