2010-08-07 14 views
15

Come posso convertire una stringa contenente caratteri glob comeGlobbing/espansione di percorso con due punti come separatore

/var/lib/gems/*/bin 

in una stringa separata da due punti di nomi di file (cioè PATH compatibile) corrisponde al modello?

cioè echo /var/lib/gems/*/bin tornerà

/var/lib/gems/1.8/bin /var/lib/gems/1.9.1/bin 

voglio

/var/lib/gems/1.8/bin:/var/lib/gems/1.9.1/bin 

invece.

L'approccio ovvio è semplicemente quello di sostituire il carattere dello spazio con ':' tramite tr, ma questo non funziona se il nome del file stesso contiene il carattere dello spazio.

risposta

16

In realtà, ho pensato a una soluzione migliore: utilizzare una funzione shell.

function join() { 
    local IFS=$1 
    shift 
    echo "$*" 
} 

mystring=$(join ':' /var/lib/gems/*/bin) 
2
printf "%s\n" /var/lib/gems/*/bin | tr "\n" ":" 
+0

Chiudi! Ma se c'è una sola corrispondenza, alla fine ottieni i due punti: "/var/lib/gems/1.9.1/bin:". (E se non c'è corrispondenza, un singolo due punti.) – mjs

7

Questo dovrebbe farlo per voi:

dirs=(/var/lib/gems/*/bin) # put filenames (dirnames) in an array 
saveIFS=$IFS IFS=':'   # set the Internal Field Separator to the desired delimiter 
dirs=("${dirs[*]}")   # convert the array to a scalar with the new delimiter 
IFS=$saveIFS     # restore IFS 
4
PATH="$(printf "%s:" /usr/*/bin)" 
PATH="${PATH%:}" 
+1

Funziona, ma io userei una variabile diversa. Puoi anche eseguire l'incarico iniziale in questo modo: 'printf -v varname"% s: "/ var/lib/gems/*/bin' –

+0

Quasi perfetto. Penso che mi piaccia piping to sed per rimuovere il colon finale anche se ala http://stackoverflow.com/a/5074995/69002 –

2

è piuttosto banale se si lascia cadere in Perl:

perl -e 'print join ":", @ARGV' /var/lib/gems/*/bin 

o Python:

python -c 'import sys; print ":".join(sys.argv[1:])' /var/lib/gems/*/bin 

o qualsiasi numero di altri linguaggi di scripting popolari.

+0

Sembra che questo potrebbe essere l'approccio migliore in generale (l'IFS giocherellona è un po 'disordinato), anche se è un peccato aver dovuto usare un programma esterno ... – mjs

+0

sicuramente la strada da percorrere se vuoi un one-liner – mdup

0

Un'altra oneliner: risposta printf "%s\n" /var/lib/gems/*/bin | paste -s -d':'

Ma @ di Timo è meglio a mio parere.

Problemi correlati