Bash – Manipolazione continua delle stringhe

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

Esiste comunque per incollare queste due linee insieme in una riga?

Risposta

FILE=$(basename "${1/%.jpeg/.jpg}") ha funzionato per me.

test:

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

contenuto dello script:

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

Commenti

  • Poiché le due righe sono un po intercambiabili, questa soluzione è finora la più ordinata … Se le righe non sono ' t intercambiabili sed sarà sicuramente necessario immagino.

Risposta

Non puoi” nidificare espansioni in bash (né in ksh, ash e altre shell oltre a zsh). Questa è solo una limitazione cosmetica, poiché come illustrato è possibile assegnare unespressione intermedia a una variabile temporanea. È un po fastidioso per le battute, ma negli script è probabilmente migliore per la leggibilità.

Potresti evitare u cantare lutilità esterna basename e utilizzare invece un costrutto di manipolazione delle stringhe:

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

Qui, succede che puoi riscrivi il tuo script in per mettere la sostituzione del comando allesterno . Questo non è un fenomeno generale, né ottieni nientaltro che una certa sensazione di battuta.

Zsh, nel bene e nel male, ti consente di annidare espansioni:

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

Oppure puoi utilizzare il costrutto integrato di zsh “invece di basename:

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

Risposta

Vorrei:

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

Il secondo parametro di basename è un suffisso da rimuovere dal nome del file (vedi man basename)

Risposta

Puoi utilizzare un singolo comando sed come illustrato di seguito:

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

Risposta

Incorporando sed, questo dovrebbe fare il trucco:

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

(Questo” t non risponde esattamente alla tua domanda perché non posso “non essere sicuro che sia possibile.)

Risposta

The Bash funzionano con nomi di variabili , quindi non cè modo di incorporare direttamente un comando. Lapproccio di @sr_ “s è unalternativa se non ti dispiace il fork in più.

Answer

La riga

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

può essere accorciato e reso più portabile con

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *