22

次のようなグロブ文字を含む文字列を変換するにはどうすればよいですか

/var/lib/gems/*/bin

パターンに一致するコロンで区切られたファイル名の文字列 (つまり、PATH 互換) に変換しますか?

つまりecho /var/lib/gems/*/bin戻ります

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

私が欲しい

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

代わりは。

明らかなアプローチは、単にスペース文字を ':' に置き換えることtrですが、ファイル名自体にスペース文字が含まれている場合は機能しません。

4

8 に答える 8

20

実際、私はより良い解決策を考えました: シェル関数を使用してください。

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

mystring=$(join ':' /var/lib/gems/*/bin)
于 2010-08-08T21:41:38.517 に答える
12

これでうまくいくはずです:

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
于 2010-08-07T13:39:21.130 に答える
6
PATH="$(printf "%s:" /usr/*/bin)"
PATH="${PATH%:}"
于 2010-08-07T15:07:02.813 に答える
2
printf "%s\n" /var/lib/gems/*/bin | tr "\n" ":"
于 2010-08-07T13:28:52.853 に答える
2

Perl に落とし込むと、かなり簡単です。

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

または Python:

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

または、他の一般的なスクリプト言語をいくつでも使用できます。

于 2010-08-07T21:11:36.427 に答える