我是一个管理很多网站的轮换团队的一员,我们继承了一个网站的一些特别糟糕的代码,我们正在彻底重新设计该网站。非常可怕的是,开发服务器上有一些链接将您带到实时服务器和旧域以及许多其他可怕的事情。
我一直在尝试编写一个 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 语句中错误地转义了某些内容,并且我尝试了很多方法,但它只给我相同的消息,指向最后几个表达式的字符。
最佳答案
sed "s.http://[^/]*/.<?php echo full_link('.;s/$/'); ?>/"
- 寻找
http://[^/]*/
- 替换为
<?php echo full_link('
- 寻找
$
- 替换为
'); ?>
关于sed - sed 给出的前面的正则表达式错误无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16226857/