簡體   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