-1

a/b/c/d基本的に、入力が与えられた場合、各パスコンポーネントの先頭と末尾にワイルドカードがあるすべての一致を返すbash スクリプトまたは関数を作成したいと思います*a*/*b*/*c*/*d*。チルダ (~) もホーム フォルダとして尊重するとよいでしょう。

これを bash で行う簡単な方法はありますか、それとも Python などでこれを行う必要がありますか?

4

1 に答える 1

2

出発点を示します。

x="a/b/c/d"                                                                     
x="*${x//\//*\/*}*"                                                             
echo $x
# output: "*a*/*b*/*c*/*d*", or all matching paths (if any)

このソリューションは完全にはほど遠いものです。具体的には、次の問題を解決する必要があります。

  • xスペースや文字などの特殊文字が含まれる場合があります*。それらは適切にエスケープする必要があります。
  • x二重スラッシュを含めることができます。例: x=a//b. *a*/*b*ではなくになってほしいと思います*a*/**/*b*
  • x先頭または末尾にスラッシュを含めることができます。例:x=/a/bまたはx=a/b/.
  • xチルダで始まる場合があります。

これらの問題はすべて、ifステートメントと置換で解決できます。


別のアプローチ (より多くのコードが必要ですが、おそらくより安全でエラーが発生しにくい) は、次のように、ループを使用して文字列を解析および解釈することです。

shopt -s nullglob

x="a/b/c/d"
IFS=/ read -a x <<< "$x"
# x is now an array in the form (a b c d)

result=(*"${x[0]}"*)

for c in "${x[@]:1}"
do
    newresult=()
    for r in "${result[@]}"
    do
        match=("$r"/*"$c"*)
        [ "${#match[@]}" -gt 0 ] && \
            newresult=("${newresult[@]}" "${match[@]}")
    done
    result=("${newresult[@]}")
done

echo "${result[@]}"

繰り返しますが、これは完璧ではありません。問題は次のとおりです。

  • ダブルスラッシュに対処する必要があります。
  • 先頭と末尾のスラッシュに対処する必要があります。
  • まだチルダに対処する必要があります。

これらの問題は扱いやすく、特殊文字についても心配する必要がないため、このソリューションは優れています。

于 2016-01-08T16:41:07.017 に答える