Sostituisce una stringa nel nome della directory usando una variabile

3

Ho un set di script per creare un nuovo file nella cartella basato su una variabile chiamata per un'altra directory che va in questo modo:

str="/home/folder/test"
base="$(basename $str)"

mkdir -p "/home/folder2/${base}"

Ciò che sto cercando di fare ora è trovare e sostituire una stringa in questa variabile quando crea la nuova cartella.

Esempio, ho:

/Home/Album-Artist[FLAC] 

assegnato alla variabile. Quando uso mkdir per creare la nuova directory, voglio trovare e sostituire "FLAC" con "V0" quindi nella nuova cartella sarà

/Home/Album-Artist[V0]
    
posta jakeokeefe 02.04.2017 - 20:20
fonte

2 risposte

4

Soluzione

Sostituisci la tua linea:

base="$(basename $str)"

con:

base="$(basename $str | sed 's/FLAC/V0/')"

o, se vuoi che le parentesi [ e ] diventino parte del modello di ricerca:

base="$(basename $str | sed 's/\[FLAC\]/[V0]/')"

Spiegazione

  • Il carattere | (o pipe ) significa essenzialmente "prendi il risultato e alimentalo nel prossimo programma".

  • Il comando sed (editor di stream) prende l'input, applica i comandi ad esso e stampa il risultato. Ad esempio, il comando s/FLAC/V0/ in sed significa "per ogni riga di input, cerca FLAC e lo sostituisce con V0 (ma non più di una volta)".

  • sed utilizza espressioni regolari anziché schemi di ricerca fissi. Ciò significa che devi sfuggire a determinati personaggi; quindi, il mio ultimo esempio dice \[ e \] nel modello di ricerca (anziché solo [ e ] ).

risposta data 02.04.2017 - 20:47
fonte
2

In bash stesso potresti chiamare sed, perl, python, swift o altre lingue.

Se stai cercando di salire di livello in bash, prova:

${var%pattern}

La% estrae uno schema dal retro della variabile in modo che in una riga si possa estrarre il finale e virare sul nuovo.

new=${base%\[FLAC\]}"[V0]" ## [FLAC] to [V0] with \ to escape []  

Più chiara è la ricerca e la funzionalità di sostituzione, supponendo che nessun artista o album sarebbe mai stato FLAC e ottenere una corrispondenza. La ricerca di fine coda in alto aiuta per quel caso limite, ma è più difficile leggere l'intento.

new=${base/FLAC/V0}
    
risposta data 02.04.2017 - 20:57
fonte

Leggi altre domande sui tag