2010-08-07 10 views
15

¿Cómo puedo convertir una cadena que contiene caracteres glob tales comoenglobamiento/expansión nombre de ruta con dos puntos como separador

/var/lib/gems/*/bin 

en una cadena separada por dos puntos de nombres de archivo (es decir PATH compatible) acorde con el patrón?

decir echo /var/lib/gems/*/bin volverá

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

Quiero

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

lugar.

El enfoque obvio es simplemente reemplazar el carácter de espacio con ':' a través de tr, pero eso no funciona si el nombre de archivo contiene el carácter de espacio.

Respuesta

16

En realidad, pensé en una solución mejor: usar una función de 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

¡Cerrar! Pero si solo hay una coincidencia, obtendrás dos puntos al final: "/var/lib/gems/1.9.1/bin:". (Y si no hay coincidencia, un solo punto). – mjs

7

Esto debe hacerlo por usted:

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

Esto funciona, pero usaría una variable diferente. También puede hacer la asignación inicial de esta manera: 'printf -v varname"% s: "/ var/lib/gems/*/bin' –

+0

Casi perfecto. Creo que me gusta canalizar sed para eliminar los puntos finales a través de ala http://stackoverflow.com/a/5074995/69002 –

2

Es bastante trivial si se pone en 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 cualquier cantidad de otros lenguajes de scripting populares.

+0

Parece que este podría ser el mejor enfoque en general (el IFS violín es un poco desordenado), aunque Es una pena tener que usar un programa externo ... – mjs

+0

definitivamente el camino a seguir si quieres un trazador de líneas – mdup

0

Otra oneliner: Respuesta printf "%s\n" /var/lib/gems/*/bin | paste -s -d':'

Pero @ del timo es mejor en mi opinión.

Cuestiones relacionadas