32742


例えば、次のコマンド

[code]

    echo a b c d e f | sed -e 's/.*\(b.*e\).*/\1/' -e 's/.*b c *\(.*\) .*/\1/'
    
[/code]

の`-e 's/.*\(b.*e\).*/\1/' -e 's/.*b c *\(.*\) .*/\1/'`の部分を変数に格納して

[code]

    echo a b c d e f | sed ${regex[0]}
    
[/code]

のように実行したいのですが、変数が展開されるときにクォーテーションマークがどのように付与されるのかを理解できず、

[code]

    regex[0]='-e s/.*\(b.*e\).*/\1/'
    
[/code]

まではできたのですが、コマンドにスペースが入った場合、どうすれば良いのかわからないため、後半のコマンドを格納することができません。  
この場合、どのように変数に格納すれば良いのでしょうか。  
よろしくお願いいたします。


CC BY-SA 3.0
2017-02-13T06:12:50.630
32619
2017-02-17T05:57:16.857
2017-02-13T10:29:50.393
9029
9029
question
bash shellscript sed
sedの引数を変数に格納する方法


若干regex変数の定義がお望みのものと違うかもしれませんが以下は如何でしょうか。

[code]

    regex="sed -e 's/.*\(b.*e\).*/\1/' -e 's/.*b c *\(.*\) .*/\1/'"
    echo a b c d e f |eval ${regex}
    
[/code]


CC BY-SA 3.0
2017-02-13T06:59:34.207
32620
2017-02-13T06:59:34.207
19716
32619
answer


引数部分を分けてみました。

[code]

    declare -A array["r"]="-e 's/.*\(b.*e\).*/\1/' -e 's/.*b c *\(.*\) .*/\1/'"
    c="sed ${array["r"]}"
    echo a b c d e f | eval $c
    
[/code]


CC BY-SA 3.0
2017-02-13T07:30:46.893
32622
2017-02-13T07:30:46.893
19460
32619
answer


オフトピっぽいですが`-f`を使うとそもそも変数を使わずに済みます。

[code]

    printf 's/.*\(b.*e\).*/\\1/\n' > hoge.sed
    printf 's/.*b c *\(.*\) .*/\\1/\n' >> hoge.sed
    echo a b c d e f  | sed -f hoge.sed
    
[/code]


CC BY-SA 3.0
2017-02-16T08:08:48.347
32715
2017-02-16T08:08:48.347
5008
32619
answer


みなさんご回答いただきまして、ありがとうございました。  
今回は最も簡素で意図していた形に近いmetropolisさんの`-e`を一つにまとめる回答を採用させていただきたいと思います。

[code]

    regex='-e s/.*\(b.*e\).*/\1/;s/.*b c *\(.*\) .*/\1/'
    echo a b c d e f | sed "$regex"
    
[/code]

今後場合によっては`eval`を利用する必要があるかもしれません。頭の隅に入れさせていただきます。


CC BY-SA 3.0
2017-02-17T05:57:16.857
32742
2017-02-17T05:57:16.857
9029
32619
answer