
簡単な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?