我在几千行上有以下模式我想使用正则表达式转换为我想要的
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
第二组捕获必须包含在 中的字符串/模式,第三组捕获同一字符串(在 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