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


11

Ricevo all'utente un certo percorso file assoluto e desidero creare una variabile che sarà una stringa che non includerà solo i PRIMI due componenti del percorso file, ma senza stamparlo o altro.

Ad esempio, il percorso assoluto potrebbe essere:

/home/myusername/folder1/folder2/folder3

Ed è salvato in "target_path" e voglio che "mydir" sia solo:

/folder1/folder2/folder3

Ho provato a usare il comando cut in diversi modi ma senza successo.


La directory /home/usernameeffettiva $HOMEdell'utente che sta invocando è? in tal caso potresti rimuoverlo semplicemente usando mydir="${target_path#$HOME}"Penso
steeldriver il

Risposte:


15

Usando la manipolazione delle stringhe di bash :

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

Quindi, la stringa desiderata sarebbe (aggiungendo nuovamente la barra iniziale):

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

Per una variabile a, ${a#foo}rimuoverà il più breve stringa corrispondente foodal inizio di a. Quindi, rimuoviamo la stringa più corta contenente tre /(inclusa la barra iniziale nel percorso), per rimuovere i primi due componenti del percorso assoluto.


Il percorso potrebbe essere di 30 cartelle e voglio includere solo gli ultimi 28. Funzionerà ancora?
Vita di pi

@Lifeofpi perché no?
muru,

9

Ecco un esempio usando cut

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

folder1/folder2/folder3

Se hai bisogno di un comando /puoi aggiungere | sed 's/^/\//'alla fine della tua linea.

È necessario -f4-perché -d '/'indica cutdi utilizzare /come delimitatore tra i campi. Quindi il primo campo viene prima del primo delimitatore, in questo caso il primo campo è vuoto. Così folder1è il 4 ° campo e -f4-dice a cut di usare tutti i campi dal 4 in poi.


7

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

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

Dopodichè:

echo $myvar

dà:

/folder1/folder2/folder3

Funziona rimuovendo la prima corrispondenza del modello /*/*/dalla variabile target_path, usando la ${target_path#pattern}sintassi di espansione del parametro shell. Sfortunatamente questo rimuove il primo /carattere, motivo per cui quel carattere deve essere esplicitamente incluso durante l'impostazione della variabile myvar.

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


Il percorso potrebbe essere di 30 cartelle e voglio includere solo gli ultimi 28. Funzionerà ancora?
Vita di pi

Sicuramente, questo taglierà solo i primi due, indipendentemente dalla lunghezza del percorso.
Arronical
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.