2010-08-07 7 views
15

Jak można konwertować zawierające ciąg znaków glob, takie jakmasek/ekspansji ścieżka z okrężnicy jako separator

/var/lib/gems/*/bin 

w ciągu okrężnicy oddzielonych nazwami (tj PATH zgodny) dopasowanie wzorca?

tj echo /var/lib/gems/*/bin powróci

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

Chcę

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

zamiast.

Oczywistym podejściem jest po prostu zamiana znaku spacji na ":" poprzez tr, ale to nie działa, jeśli sama nazwa pliku zawiera znak spacji.

Odpowiedz

16

Właściwie, pomyślałem o lepszym rozwiązaniu: użyj funkcji powłoki.

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

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

Zamknij! Ale jeśli jest tylko jeden mecz, na końcu pojawia się dwukropek: "/var/lib/gems/1.9.1/bin:". (A jeśli nie ma dopasowania, pojedynczy dwukropek.) – mjs

7

to powinien to zrobić dla Ciebie:

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

To działa, ale użyłbym innej zmiennej. Możesz również wykonać podstawowe zadanie w następujący sposób: 'printf -v varname"% s: "/ var/lib/gems/*/bin' –

+0

Prawie idealnie. Myślę, że lubię orurowanie do sed, aby usunąć tylny dwukropek, ale ala http://stackoverflow.com/a/5074995/69002 –

2

Jest to dość trywialne, jeśli spadnie na Perl:

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

lub Python:

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

Lub dowolną liczbę innych popularnych języków skryptowych.

+0

Wygląda na to, że może to być najlepsze podejście ogólne (skrzypce IFS są trochę nieporządne), chociaż to wstyd, że trzeba użyć zewnętrznego programu ... – mjs

+0

zdecydowanie droga, jeśli chcesz jedno-liniowej – mdup

0

Innym oneliner: odpowiedź printf "%s\n" /var/lib/gems/*/bin | paste -s -d':'

ale @ Timo jest lepszy moim zdaniem.

Powiązane problemy