Assegnando solo una parte di una stringa a una variabile in bash

11

Ricevo dall'utente un determinato filepath assoluto e voglio creare una variabile che sarà una stringa che non includerà solo i FIRST due componenti del percorso del file, ma senza stampare questo o altro

Ad esempio, il percorso assoluto potrebbe essere:

/home/myusername/folder1/folder2/folder3

E viene salvato in "target_path" e voglio che "mydir" sia solo:

/folder1/folder2/folder3

Ho provato a utilizzare il comando di taglio in modi diversi ma senza successo.

    
posta Life of pi 10.11.2016 - 14:56
fonte

3 risposte

15

Uso della manipolazione della stringa di bash :

$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3

Quindi, la stringa che vuoi sarebbe (aggiungendo di nuovo la barra iniziale):

b="/${a#/*/*/}"

Per una variabile a , ${a#foo} rimuoverà la stringa più breve che corrisponde a foo da inizio di a . Quindi, rimuoviamo la stringa più breve contenente il tre% di co_de% (compresa la barra iniziale nel percorso), per rimuovere i primi due componenti del percorso assoluto.

    
risposta data muru 10.11.2016 - 15:08
fonte
9

Ecco un esempio che utilizza cut

echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4- 

folder1/folder2/folder3

Se hai bisogno del primo / potresti aggiungere | sed 's/^/\//' alla fine della tua linea.

Hai bisogno di -f4- perché -d '/' dice cut per usare / come delimitatore tra i campi. Quindi il primo campo arriva prima del primo delimitatore, in questo caso il primo campo è vuoto. Quindi folder1 è il 4 ° campo e -f4- dice cut per utilizzare tutti i campi dal 4 in poi.

    
risposta data bc2946088 10.11.2016 - 15:07
fonte
7

Puoi usare l'espansione dei parametri bash in questo modo:

target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"

Dopo questo:

echo $myvar

dà:

/folder1/folder2/folder3

Funziona rimuovendo la prima corrispondenza del pattern /*/*/ dalla variabile target_path, utilizzando la sintassi di espansione del parametro della shell ${target_path#pattern} . Sfortunatamente questo rimuove il primo carattere / , motivo per cui quel personaggio deve essere esplicitamente incluso mentre si imposta la variabile myvar.

Avviso: è necessario verificare che la variabile target_path contenga alcuni caratteri e che sia più lunga di due segmenti di percorso prima di utilizzare questo metodo. Ad esempio se target_path=/home/username/ , poi myvar=/ . Questo potrebbe essere pericoloso per il tuo sistema se stai eseguendo qualcosa come rm -rf "$myvar"* . Non provarlo!

    
risposta data Arronical 10.11.2016 - 15:09
fonte

Leggi altre domande sui tag