bash関数を使用してsedから代替文字列を作成する方法、特に一般に \1, \2, ...? で識別される 1 つ以上の見つかった部分がある関数です。
つまり、私は次のことをしたいと思います。
sed -e 's/\(.*\)/<bash_function \1>/'
注:このQは次のようになります。sed式にシェルコマンドを含める方法は?しかし、GNU / Linuxコマンドを呼び出す代わりに、単に基本的なbash関数を呼び出したいと思います。
答え1
次のe
フラグを使用して、GNU sedを使用してこれを行うことができます。
金利
このコマンドを使用すると、シェルコマンドの入力をパターンスペースにパイプできます。置換が行われると、パターン空間内のコマンドが実行され、その出力がパターン空間を置き換えます。末尾の改行は抑制されます。実行するコマンドに NUL 文字が含まれている場合、結果は定義されません。これはGNU sed拡張です。
次の制限が適用されます。
その後、全体の結果「パターン空間」(すなわち、検索および置換後の完全な入力文字列)が実行される。つまり、最後の2つのスラッシュの間にある内容だけでなく実行されます。これはあなたの例に示されていますが、実際に望むものではないかもしれません。
あなたのシステム
/bin/sh
はbash
ここで説明したように関数をエクスポートしました。Bashで関数を「エクスポート」できますか?
たとえば、私のシステム(デフォルトでは/bin/sh
シェルがある場合dash
)では、手順は次のようになります。
sudo ln -sf bash /bin/sh
foo() { echo "Doing foo on $1"; }
export -f foo
だから私はできます
$ echo bar | sed 's/\(.*\)/foo \1/e'
Doing foo on bar
以下は、検索と置換を実行した後に入力文字列全体をより明確にする別の例です。
echo 'bar; echo xx' | sed 's/\(.*\)/foo \1/e'
Doing foo on bar
xx
/bin/sh
それができない場合は、bash
最も近い方法は関数定義をファイルに入れて最初にインポートすることです。
$ echo bar | sed 's/\(.*\)/foo \1/e'
sh: 1: foo: not found
しかし与えられた
$ cat ./myfuncs.sh
foo() { echo "Doing foo on $1"; }
それから
$ echo bar | sed 's/\(.*\)/. .\/myfuncs.sh ; foo \1/e'
Doing foo on bar