bash:sed搜索并替换数组元素的路径

时间:2017-03-17 22:23:16

标签: arrays regex bash shell sed

在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。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你甚至可以更进一步使用bashes自己的替代品:

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