2016-01-08 116 views
-1

基本上,我想編寫一個bash腳本或函數,在給定輸入a/b/c/d的情況下,它將返回所有匹配,其中每個路徑組件在開始和結束處具有通配符,例如, *a*/*b*/*c*/*d*。將代字號(〜)作爲主文件夾也很好。基於a/b/c/d的輸入返回與* a */* b */* c */* d *匹配的Bash函數?

有沒有一種簡單的方法在bash中做到這一點,或者我需要在Python這樣的東西中做到這一點?

+2

其他一些例子會很有用。另外,我想,'〜'擴展功能將是一個麻煩。 –

回答

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/bx=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[@]}" 

再次,這是不完善。問題包括:

  • 你必須處理雙斜線。
  • 您必須處理前導斜槓和尾部斜槓。
  • 你仍然必須處理代字號。

這個解決方案很好,因爲這些問題更容易處理,您也不必擔心特殊字符。

+1

在'echo $ x'中保留變量不加引號是這裏的關鍵。 –

相關問題