在bash中我有一个带路径名的数组,我想用sed用不同的数组替换它们,如下所示:
sed 's@^(.*?)master_repo(.*?)@\1"${SOME_REPO_NAME}"\2@g' <<< ${FULL_TGT_DIRS[${i}]}
作为数组元素的样本路径名称为:
/Volumes/munki/master_repo/pkgs/apps
我想用例如“somedir”替换路径名“master_repo”,它存储在$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。
答案 0 :(得分:0)
没有必要使用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
答案 1 :(得分:0)
你甚至可以更进一步使用bashes自己的替代品:
for file in "${FULL_TGT_DIRS[@]/master_repo/somedir}"
do
...work on file variable here...
done