1

$foo正規表現の検索/置換を考え出して、変数 (eg; ) を中かっこ (eg; ) でカプセル化しようとしています${foo}。次の正規表現を思いつきましたが、意図したとおりに機能しません。

s/"\([^"]*\)\$\([a-zA-Z0-9:]*\)\([^"]*\)"/"\1\${\2}\3"/g

ただし、このパターンにはいくつか問題があります。引用符で囲まれた文字列ごとに 1 つのパターンのみを実行します。ファイルに対して式を複数回実行できますが、既に中かっこでカプセル化された変数は処理されないため、これで問題ありません。2 番目のブレース セットを配置するだけです。

私の考えは中かっこを取り除く\2ことですが、パターンはまだ一致し、引用符で囲まれた文字列ごとに1つの置換しか実行しないため、これはうまくいかないと思います。後方参照式のドキュメントを見ましたが、より良いアプローチを判断できません。

4

2 に答える 2

3

次のことを試してください。

sed -e ':loop' -e 's/"\([^"]*\)\$\([a-zA-Z0-9:]\{1,\}\)\([^"]*\)"/"\1\${\2}\3"/' -e 't loop'

これにより、検索/置換がループに入り、置換ができなくなるまで各行で繰り返し置換が試行されます。

これは、実行するコマンドがもうない場合にのみ処理中の行が出力され、:loopという名前のラベルが作成されloop、置換が成功した場合にのみt loopラベルに実行が返されるためです。loop

コメントでpotongが述べたように、これは複数の引用符を持つ行で奇妙な動作をする可能性があります.これらのシナリオで適切に機能する代替手段を次に示します:

sed -e ':loop' -e 's/^\([^"]*\("[^"]*"[^"]*\)*\)"\([^"]*\)\$\([a-zA-Z0-9:]\{1,\}\)\([^"]*\)"/\1"\3\${\4}\5"/' -e 't loop'
于 2012-10-01T23:07:47.263 に答える
1

これはうまくいくかもしれません(GNU sed):

echo 'a "$a" b $b "b $b b $b" $c c $c "$c c $c"' | 
sed 's/"\([^"]*\)"/"\n\1\n"/g;:a;s/\n\n//;ta;s/\n\$\([a-zA-Z0-9:]\+\)/${\1\}\n/;ta;s/\n\(.\)/\1\n/;ta'
a "${a}" b $b "b ${b} b ${b}" $c c $c "${c} c ${c}"
于 2012-10-02T08:58:12.270 に答える