sedスクリプトにパラメータを渡すことはできますか?

sedスクリプトにパラメータを渡すことはできますか?

簡単なsedスクリプトを考えてみましょうfoo-to-bar.sed

s/foo/bar/

そして簡単な呼び出し:

sed -f foo-to-bar.sed some-file.txt

それでは、代替文字列(この場合はbar)をカスタマイズし、それをsedスクリプトにパラメータとして渡すとします。それは可能ですか?

注:sedスクリプトを削除し、シェル変数をインラインで使用できることを知っています。私は特にsedスクリプトにパラメータを渡すことに興味があります。ドキュメントには何も見つかりませんが、まだ何かが欠けていることを願っています。

答え1

実際にはパラメータを渡す方法がないように思えるので、私が考えることができる最善の解決策は、コマンドラインで置き換えられた中間プレースホルダを使用することです。foo-to-bar.sed:

s/foo/#ARG1#/

移動する:

sed -f foo-to-bar.sed -e "s/#ARG1#/bar/g" some-file.txt

説明:foo最初に置き換えてから、#ARG1#コマンドbarラインから渡された内容に置き換えます。-e後で持つことが重要であることに注意してください-f。区切り文字も特別なものではなく、#通常ファイルに表示されないものを使用してください。

答え2

はい、完全に可能です! -
シェルで変数を定義し、次のようにスクリプトから変数名をエスケープできます。

s/'$replace'/bar/

次に、スクリプトを次のように呼び出します。

replace="foo" && sed -f script.sed

ファイルをパラメータとして渡す場合、ここでの秘密は、次のパラメータなしでスクリプトを終了することです。

/foo/{
  s/foo/bar/
}

次に、シェルまたはシェルからxargs呼び出しfindてパラメータを置き換えます。

find ./shelves -type f \( -name "*.json"  -o -name "*.csv" \) -print -exec sed -f main.sed {} \;

効果がある!

答え3

良い解決策はありませんが、解決策があります。最善の方法は、おそらく以下を使用することですenvsubst

a.sed.tpl:

s/$s/x/

a.sh:

s=e
echo aoeu | sed -Ef <(cat a.sed.tpl | s=$s envsubst '$s')
$ bash -eu a.sh
aoxu

値はそのまま渡されます。ランダムな文字列を渡して文字通り処理するには、実行する前にエスケープする必要がありますsed

$抜け出す道がないようでしたenvsubst

もっと選択ここ

答え4

sedコードで二重引用符を使用する限り、sed内にパラメータを渡すことができます。

次の練習を試してください。

$ cat infile
Is it possible to pass arguments to a sed script?
$ fsed() { sed "s/pass/$1/g" "$2"; }
$ fsed PASS infile
Is it possible to PASS arguments to a sed script?

関連情報