Apache書き換え規則のパターン正規表現

Apache書き換え規則のパターン正規表現

正規表現を使用して目的に変換したい数千行に次のパターンがあります。

RewriteRule ^/omg/deadly-venom/?$ http://www.example.com/omg/deadly-venom [L,NC,R=301]
RewriteRule ^/buzz/get-on-it/?$ http://www.example.com/buzz/get-on-it/ [L,NC,R=301]

そして何千もの他の同様のライン

だから基本的に私はこれが欲しい

RewriteRule ^/omg/(deadly-venom)/?$ http://www.example.com/omg/$1 [L,NC,R=301]
RewriteRule ^/buzz/(get-on-it)/?$ http://www.example.com/buzz/$1 [L,NC,R=301]

どうやってこれを達成できますか?私はSublimeテキストエディタを使用していますが、端末でsedまたはawkを使用することもできます。

更新:最後の項目は、/このように以前に二重スラッシュを生成しないでください。代わりに、終わりのある行とない行を見るには、上から前後を見てください。$1//$1/$1/

答え1

私はそうします:

sed -E 's|(.*/)([^/]*)(/\?\$.*)\2/{,1}|\1(\2)\3$1|' infile

2番目のグループは含める必要がある文字列/パターンをキャプチャし、3番目のグループは(...)同じ文字列(LHSで逆参照)の後のすべての項目をキャプチャします(可能な場合は末尾のスラッシュを含む)。\2したがって、デフォルトでは、これは拡張正規表現をサポートしていない場合は次の\1\2\3\2{0 or 1 slash}ように置き換えられます\1(\2)\3$1
sed-E

sed 's|\(.*/\)\([^/]*\)\(/?\$.*\)\2/\{,1\}|\1(\2)\3$1|' infile

関連情報