Bash – Folyamatos karakterlánc-manipuláció

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

Van-e mód arra, hogy ezt a két vonalat egy vonalba ragasszuk?

Válasz

FILE=$(basename "${1/%.jpeg/.jpg}") nekem működött.

teszt:

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

szkript tartalma:

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

megjegyzések

  • Mivel a két vonal kissé felcserélhető, ez a megoldás egyelőre a legtisztább … Ha a vonalak nem ' t felcserélhetők sed feltétlenül szükség lesz erre.

Válasz

Nem lehet fészkelni bővítések a bash-ban (sem a ksh-ben, sem a hamuban, sem az egyéb héjakban, kivéve a zsh-t). Ez csak kozmetikai korlátozás, mivel amint szemlélteti, egy ideiglenes változóhoz hozzárendelhet egy köztes kifejezést. Ez kissé bosszantó az egyvonalasak számára, de szkriptekben vitathatatlanul jobb az olvashatóság érdekében.

Kerülhetné az u énekeld a basename külső segédprogramot, és használj helyette egy karakterlánc-manipulációs konstrukciót:

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

Itt előfordulhat, hogy írja át a szkriptet úgy, hogy a parancs helyettesítése kívülre kerüljön . Ez nem általános jelenség, és nem is szerez semmi mást, mint egy bizonyos egyvonalas érzés.

A Zsh jó vagy rossz szempontból lehetővé teszi a bővítések fészkelését:

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

Vagy használhatja a zsh beépített konstrukcióját a basename helyett:

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

Válasz

Mennék:

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

A basename második paramétere a fájlnévből eltávolítandó utótag (lásd: man basename)

Válasz

Használhat egyetlen sed parancsot, a következők szerint:

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

Válasz

A sed befogadásával ezt kell cselekednie:

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

(Ez nem felel meg pontosan a kérdésére, mert nem tudom; nem tudom, hogy lehetséges-e.)

Válasz

A Bash konstrukció változónevekkel működik, így nem lehet közvetlenül beágyazni egy parancsot. A @sr_ megközelítése alternatív, ha nem veszi figyelembe az extra villát.

Válasz

A sor

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

lerövidíthető és hordozhatóbbá tehető a

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük