web-dev-qa-db-ja.com

sedの引数としてシェルスクリプト変数をどのように使用しますか?

私がやりたいのは次のようなものです。

#!/bin/sh
EMAIL="-e 's/SOMETHING//g'"

somecommand | sed "$EMAIL"

しかし、私は次のようになります。

sed: -e expression #1, char 2: unknown command: `''

私は多くのバリエーションを試しました。文字列の引用を正しくするだけの問題だと私は知っています。これを実行したい理由は、読みやすさのために長いsedコマンドを分割するためです。代わりにsedスクリプトファイル(-fオプション付き)を使用する必要がありますか?

更新:

私の実際のスクリプトはもう少し複雑です。

#!/bin/sh
EMAIL="-e s/SOME THING//g -e s/SOME THING ELSE//g ..."

somecommand | sed "$EMAIL"

一重引用符を削除すると、次のようになります。

sed: -e expression #1, char 18: unknown option to `s'
12
Swoogan

このタイプの引用問題の場合、次のいずれかを実行できます。

#!/bin/sh
SED_ARG="-e 's/SOMETHING//g'"
echo SOMETHING | eval sed "$SED_ARG"
echo SOMETHING | sed $SED_ARG

何が起こっているのかというと、あなたのバージョンでは、シェルは1つの引数(文字列 "-e's/SOMETHING // g '")でsedを呼び出していますが、sedを2つの引数( "-e"と " 's/SOMETHING // g' ")。 Evalにより、シェルは文字列を希望どおりに解釈します。引数を引用しないため、Wordの分割が発生します。この種のものはかなり壊れやすいことに注意してください。

18
William Pursell

sedスクリプトに引数を渡す は、grepの記述例を示しています。

#!/bin/sh
#File: sedgrep
sed -n 's/'"$1"'/&/p'

grepは、次のように実行できます。

sedgrep '[A-Z][A-Z]' <file
9
nik

これは私にとってはうまくいきました(二重引用符で囲みます):

 env | sed -n /"$USERNAME"/p
0
blispr

すべてを一重引用符で囲み、後で使用するときにシェルに評価させます。

EMAIL='-e s/[email protected]//g'
EMAIL2='-e s/[email protected]//g;s/[email protected]//g'
echo "[email protected] [email protected] [email protected] [email protected]" | sed $EMAIL $EMAIL2

EMAILの値から一重引用符を削除します。

EMAIL="-e s/SOMETHING//g"
0
David Z

一重引用符を削除すると、問題なく機能するはずです

0
ennuikiller