繁体   English   中英

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

[英]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。

无需为此使用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

您甚至可以进一步使用篮筐自己的替换物:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM