[英]bash: sed search and replace the path of array elements
在bash中,我有一個帶有路徑名的數組,我想使用sed將它們替換為不同的名稱,如下所示:
sed 's@^(.*?)master_repo(.*?)@\1"${SOME_REPO_NAME}"\2@g' <<< ${FULL_TGT_DIRS[${i}]}
作為數組元素的示例路徑名將為:
/Volumes/munki/master_repo/pkgs/apps
我想將路徑名“ master_repo”替換為例如“ somedir”,該路徑名存儲在$SOME_REPO_NAME
,因此我得到:
/Volumes/munki/somedir/pkgs/apps
或使用內置的字符串替換:
for i in ${FULL_TGT_DIRS[@]}
do
FULL_TGT_DIRS[$i]=${FULL_TGT_DIRS[$i]/master_repo/$SOME_REPO_NAME}
#sed 's@^(.*?)master_repo(.*?)@\1"${SOME_REPO_NAME}"\2@g' <<< ${FULL_TGT_DIRS[${i}]}
done
運行腳本時,總是出現以下錯誤:
> /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")
我試過使用不同的分隔符和sed選項,以及通過不同的報價組進行改組。 我不是每天都寫bash腳本,所以也許我遺漏了一些東西?
順便說一句,我在Mac上運行此程序,因此只能使用bash 3.2。
無需為此使用sed
, bash
在其參數擴展中內置了字符串替換功能。
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
您甚至可以進一步使用籃筐自己的替換物:
for file in "${FULL_TGT_DIRS[@]/master_repo/somedir}"
do
...work on file variable here...
done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.