2017-03-17 56 views
2

在bash我有路徑名稱的數組,我想使用SED不同者,像這樣以替換它們:的bash:sed的查找和替換的數組元素的路徑

sed '[email protected]^(.*?)master_repo(.*?)@\1"${SOME_REPO_NAME}"\[email protected]' <<< ${FULL_TGT_DIRS[${i}]} 

甲這是樣品路徑名的陣列的元素將是:

/Volumes/munki/master_repo/pkgs/apps 

我想替換的路徑名「master_repo」與例如「somedir」,其被存儲在$SOME_REPO_NAME,所以我得到:

/Volumes/munki/somedir/pkgs/apps 

或者與內置的字符串替換:

> /usr/local/bin/repomgr: line 135: 
> /Volumes/munki/master_repo/pkgs/apps: syntax error: operand expected 
> (error token is "/Volumes/munki/master_repo/pkgs/apps") 

我使用不同separaters和SED選項,以及嘗試:

for i in ${FULL_TGT_DIRS[@]} 
do 
    FULL_TGT_DIRS[$i]=${FULL_TGT_DIRS[$i]/master_repo/$SOME_REPO_NAME} 
    #sed '[email protected]^(.*?)master_repo(.*?)@\1"${SOME_REPO_NAME}"\[email protected]' <<< ${FULL_TGT_DIRS[${i}]} 
done 

運行我的劇本的時候,我總是得到以下錯誤通過不同的報價星座來洗牌。我不會每天寫bash腳本,所以也許我錯過了一些東西?

順便說一句,我在Mac上運行它,因此只有在我的處置bash 3.2。

回答

0

對此沒有必要使用sedbash在其參數擴展中內置了字符串替換。

var=/Volumes/munki/master_repo/pkgs/apps 
$SOME_REPO_NAME=somedir 
newvar=${var/master_repo/$SOME_REPO_NAME} 

for-in循環中,變量被設置爲數組元素,而不是數組索引,所以你不應該使用FULL_TGT_DIRS[$i] - $i包含路徑。所以循環應該是:

for file in ${FULL_TGT_DIRS[@]} 
do 
    file=${file/master_repo/$SOME_REPO_NAME} 
    # Do something with $file here 
done 

如果您需要修改到位數組,你需要爲索引中的不同的循環:

for ((i = 0; i < ${#FULL_TGT_DIRS[@]}; i++)) 
do 
    FULL_TGT_DIRS[$i]=${FULL_TGT_DIRS[$i]/master_repo/"$SOME_REPO_NAME"} 
done 
+0

我根據你的回答更新了我的問題。我仍然得到同樣的錯誤。 – pming

+0

我已更新答案以顯示循環數組的正確方法。 – Barmar

+0

是的,我需要修改陣列的值。最後一塊給我解決。謝謝! – pming

0

你甚至可以更進一步使用bashes自行更換:

for file in "${FULL_TGT_DIRS[@]/master_repo/somedir}" 
do 
    ...work on file variable here... 
done