こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

sedの引数を変数に格納する方法

例えば、次のコマンド
echo a b c d e f | sed -e 's/.*\(b.*e\).*/\1/' -e 's/.*b c *\(.*\) .*/\1/'
の「-e 's/.*\(b.*e\).*/\1/' -e 's/.*b c *\(.*\) .*/\1/'」の部分を変数に格納して
echo a b c d e f | sed $regex
のように実行したいのですが、変数が展開されるときにクォーテーションマークがどのように付与されるのかを理解できず、
regex=’-e s/.*\(b.*e\).*/\1/'
まではできたのですが、コマンドにスペースが入った場合、どうすれば良いのかわからないため、後半のコマンドを格納することができません。
この場合、どのように変数に格納すれば良いのでしょうか。
よろしくお願いいたします。

投稿日時 - 2017-02-13 15:09:02

QNo.9293402

暇なときに回答ください

質問者が選んだベストアンサー

evalを使わないと駄目みたいです。

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

投稿日時 - 2017-02-13 22:56:39

お礼

ご回答いただきまして、ありがとうございます。
エスケープで対応できないのはなぜでしょうか?
よろしくお願いいたします。

投稿日時 - 2017-02-13 23:21:38

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>クォートが本来のクォートとして機能せず、文字として認識されるという意味でしょうか?

はいそういう意味です。
A="'*'"
echo $A ⇒ '*' と、クォートが効いているように見えるが、
touch "'foo'"
ls ⇒ 'foo'
echo $A ⇒ 'foo' と、「'*'」は「'」で始まり「'」で終わるファイル名にマッチする

投稿日時 - 2017-02-16 02:16:10

お礼

そういうことでしたか。ありがとうございました。

投稿日時 - 2017-02-16 16:55:36

ANo.2

>エスケープで対応できないのはなぜでしょうか?

クォートを外す処理の方が、変数展開よりも先に行われるため、変数内のクォートは除去されません。なので、クォートが残ってしまい、【未知のコマンドです: 「"」】のようなエラーになります。

投稿日時 - 2017-02-14 01:33:24

お礼

ご回答いただきまして、ありがとうございます。
すみません、「クォートを外す処理が展開より先に行われ、クォートが残る」のイメージが湧きません^^;
クォートが本来のクォートとして機能せず、文字として認識されるという意味でしょうか?

投稿日時 - 2017-02-16 00:05:24