sed给出的前面的正则表达式错误无效

时间:2013-04-26 00:25:28

标签: sed grep

我是一个管理很多网站的轮换团队的一员,我们为一个网站继承了一些特别糟糕的代码,我们正在完全重新设计。可悲的是,开发服务器上有链接可以引导您访问实时服务器和旧域以及许多其他可怕的,可怕的东西。

我一直在尝试编写一个grep / sed命令,用我们现在在我们网站上使用的用户定义的php函数full_link替换所有这些链接,以防止所有链接到不同的地方。所以(使用我们域名的占位符)而不是编写http://www.place.com/foo/bar,您可以编写<?php echo full_link('foo/bar'); ?>,当我们将其从一台服务器移动到另一台服务器时,它将起作用。

这是我得到的:

grep -v 'echo' * -r -P | grep "(?<=<a href=['\"])(http:\/\/foo\.bar\.net\/|10\.41\.6\.118\/|http:\/\/foo2\.bar\.net\/)([^<]*?)(?=['\"])" -P | sed -r "s@(?<=<a href=['\"])(http://foo\.bar\.net/|10\.41\.6\.118/|http://foo2\.bar\.net/)([^<]*?)(?=['\"])@<?php echo full_link('\2'); ?>@gpw output"

(如果你想知道第一个grep或[^<],它们只是一个基本的尝试,不让php标签放在现有的php标签中。因为它只是第一次进行手动编辑没有完整的复制粘贴链接并被重定向到错误的服务器,它不需要是完美的,但我愿意采用更好的方法来做到这一点。)

我已经有了grep语句正在工作并且接受了我希望他们得到的内容,但是当我将sed添加到最后时,就会发生这种情况:

sed: -e expression #1, char 159: Invalid preceding regular expression

从我做过的研究来看,似乎我可能在我的sed语句中错误地转义了一些东西,并且我尝试了很多东西,但它只给了我同样的信息指向最后几个表达的字符。

1 个答案:

答案 0 :(得分:1)

sed "s.http://[^/]*/.<?php echo full_link('.;s/$/'); ?>/"
  • 寻找http://[^/]*/
  • 替换为<?php echo full_link('
  • 寻找$
  • 替换为'); ?>