Bash – Kontinuální manipulace s řetězci

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

Je vůbec možné tyto dva řádky slepit do jedné linky?

Odpověď

FILE=$(basename "${1/%.jpeg/.jpg}") pracoval pro mě.

test:

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

obsah skriptu:

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

Komentáře

  • Jelikož jsou tyto dva řádky vzájemně zaměnitelné, je toto řešení zatím nejkrásnější … Pokud řádky nejsou ' zaměnitelné sed bude podle mě určitě potřeba.

Odpověď

Nemůžete“ vnořit “ expanze v bash (ani v ksh, ash a dalších skořápkách kromě zsh). Toto je pouze kosmetické omezení, protože jak ilustrujete, můžete dočasné proměnné přiřadit přechodný výraz. Je to trochu otravné pro jednorázové, ale ve skriptech je to pravděpodobně lepší pro čitelnost.

Dalo by se zabránit u zpívat externí nástroj basename a místo toho použít konstrukt pro manipulaci s řetězci:

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

Tady se stane, že můžete přepište svůj skript a vnějte substituci příkazu . To není obecný jev a nezískáte nic jiného než určitý pocit jedné linie.

Zsh, ať už k lepšímu nebo k horšímu, vám umožní vnořit expanze:

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

Nebo můžete použít vestavěný konstrukt zsh místo basename:

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

Odpověď

Chtěl bych:

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

Druhým parametrem basename je přípona, která má být odstraněna z názvu souboru (viz man basename)

Odpovědět

Můžete použít jeden sed příkaz jako v následujícím:

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

Odpověď

Začlenění sed by mělo stačit:

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

(Toto přesně neodpovídá na vaši otázku, protože nemohu; nejsem si jistý, zda je to možné.)

Odpovědět

Bash konstrukty pracují s názvy proměnných , takže neexistuje žádný způsob, jak přímo vložit příkaz. Přístup @sr_ je alternativou, pokud vám nevadí extra vidlice.

Odpovědět

Řádek

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

lze zkrátit a učinit přenosnějším pomocí

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *