2017-03-17 5 views
2

私は、パス名の配列を持っている、と私は別のものがそうのように、sedを使用して、それらの各々を交換したいと思います:はbash:sedを検索し、配列要素のパスを置き換えるには、bashで

sed '[email protected]^(.*?)master_repo(.*?)@\1"${SOME_REPO_NAME}"\[email protected]' <<< ${FULL_TGT_DIRS[${i}]} 

A配列の要素であるサンプルのパス名は次のようになります。

/Volumes/munki/master_repo/pkgs/apps 

私は$SOME_REPO_NAMEに保存されている例えば「somedir」、とパス名「master_repo」を交換したいと思いますので、私は得る:

/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 '[email protected]^(.*?)master_repo(.*?)@\1"${SOME_REPO_NAME}"\[email protected]' <<< ${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") 

私はだけでなく、異なるseparatersやsedのオプションを使用して試してみましたさまざまな見積もりの​​星座をシャッフルします。私は日常的にbashスクリプトを書いていないので、おそらく私は何かを逃していますか?

私はこれをMac上で実行していますので、私の処分ではbash 3.2しか使用できません。

答えて

0

これにはsedを使用する必要はありません。bashには、パラメータ拡張で組み込みの文字列置換があります。 for-inループでは

var=/Volumes/munki/master_repo/pkgs/apps 
$SOME_REPO_NAME=somedir 
newvar=${var/master_repo/$SOME_REPO_NAME} 

は、変数が配列の要素ではなく、配列インデックスに設定されますので、あなたは FULL_TGT_DIRS[$i]使用すべきではない - $iは、パス名が含まれています。だから、ループは次のようになります。あなたも、さらにbashes自身の交換を使用して、ステップに行くことができ

for ((i = 0; i < ${#FULL_TGT_DIRS[@]}; i++)) 
do 
    FULL_TGT_DIRS[$i]=${FULL_TGT_DIRS[$i]/master_repo/"$SOME_REPO_NAME"} 
done 
+0

回答に基づいて質問を更新しました。私はまだ同じエラーが発生します。 – pming

+0

私は、配列をループする正しい方法を示す答えを更新しました。 – Barmar

+0

はい、配列の値を変更する必要があります。最後のブロックは私のために働いた。ありがとうございました! – pming

0

:あなたの場所で配列を変更する必要がある場合

for file in ${FULL_TGT_DIRS[@]} 
do 
    file=${file/master_repo/$SOME_REPO_NAME} 
    # Do something with $file here 
done 

は、あなたがインデックスに別のループを必要とします:

for file in "${FULL_TGT_DIRS[@]/master_repo/somedir}" 
do 
    ...work on file variable here... 
done 
関連する問題