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