シェルスクリプトで任意の行末に追記したい


シェルスクリプト初心者で勉強中です。よろしくお願いします。

下記のようなコンフィグファイルがあって、

[code]

    valueA="aaaaaaa"
    valueB="[@$]" 
    
[/code]

上記のvalueBの値の  
`"[@$]"` の後に  
`"[@$]" '/xxx/' '/xxx/' '/xxx/' ........`  
という様にスペースで区切りながら任意のディレクトリパスを追記していける  
シェルスクリプトを作りたいと思っています。

include.lstというリストファイルの中に、`/xxx/`の部分のリストを作り  
それをwhile文で読込ませて実行しようとしましたが、  
sedが思ったように動きませんでした。

include.lstの中身の例です。

[code]

    /home/aaa/
    /usr/bbb/
    .
    .
    .
    
[/code]

失敗例です。  
<失敗例1>

[code]

    while read line 
    do
     sed -i -e "/valueB/s/$/ $line/g"
    done < include.lst
    
[/code]

==============================================  
<失敗例2>

[code]

    while read line 
    do
     sed -i -e "|valueB|s|$| $line|g"
    done < include.lst
    
[/code]

==============================================

これが`$line`のような変数でなければsed自体は成功します。  
例）

[code]

    sed -i -e "/valueB/s/$/ \'\/var\/\'/g"
    
[/code]

また、

[code]

    sed -i -e "s|xxx| $line|g"
    
[/code]

の様に先に検索文字列を入れなければ、これも成功します。

この様な場合、どうしたらいいかご存知の方がいらっしゃいましたらご教示頂けないでしょうか。  
別にwhile文やsedにこだわっているわけではありません。  
よろしくお願いします。




パスの両端は `'` で囲むとします。  
ただし、パス内部に `'` が含まれる場合、エスケープを必要とするため、今回はシェルのエスケープを想定して `'"'"'` に置換します。

[code]

    # include.lst
    /home/aaa/
    /usr/bbb/
    /tmp/'a/
    
    ↓
    
    # config.txt
    valueB="[@$]" '/home/aaa/' '/usr/bbb/' '/tmp/'"'"'a/'
    
[/code]

全体のスクリプトは下記となります。

[code]

    $ qq="'"
    $ value_b_paths=$(sed '-e :loop;${;s/'$qq'/'$qq'"'$qq'"'$qq'/g;s/^/'$qq'/;s/$/'$qq'/;s/\n/'$qq' '$qq'/g;};N;bloop' include.lst)
    $ sed -i /valueB/a\\"$value_b_paths" config.txt && sed -i '-e /valueB/{;N;s/\n/ /;}' config.txt
    
[/code]

二行目で `valueB` の終端に追記する文字列 `value_b_paths` を作ります。  
`include.lst` を一気に全行読み込み、引用符を置換していきます。

三行目の前段で `valueB` の次行にパスを追記してファイル更新し、後段で一行にまとめて再度ファイル更新します。  
特殊文字が入ったパターンを適切にエスケープする手間を省くためです。

二行目はエスケープが入り組んでいるため複雑に見えますが、解きほぐすと単純な sed のスクリプトになります。

[code]

    :loop
    ${
      s/'/'"'"'/g
      s/^/'/
      s/$/'/
      s/\n/' '/g
    }
    N
    bloop
    
[/code]

