2011-05-16 91 views
1

我试图以编程方式替换<?<?php在一堆文件中,但我的sed正则表达式不像我预期的那样。你能告诉我它有什么问题吗?使用sed替换<?与<?php

我在命令行上这里测试它:

$ sed -e 's/<\?/<\?php/g' 
<? 
<?php?<?php 
d 
<?phpd<?php 
+0

什么是你的输入,你有什么输出 - 这是测试案例“是不可能的阅读 – 2011-05-16 20:18:26

回答

3

我不认为你需要对这种转义:

sed -e 's/<?/<?php/g' 
+0

事实上,你不知道。 – 2011-05-16 20:20:37

+0

是的,我认为你可以。您发布的解决方案将匹配可选的<,而不是文字<? – 2011-05-16 20:23:33

+0

也许它取决于sed的版本,但是我使用的版本中的'\?'是可选的字符量词。 http://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html – 2011-05-16 20:26:41

0

你真的必须使用SED,或者你也可以使用perl?

perl -pi.tmp -e 's,^<\?(?!php),<?php,' *.php *.inc 
rm *.tmp 

我使用的是负前瞻,以避免在该文件已经用正确的字符开头的情况下产生<?phpphp

1

您不需要替换替换中的后退引用。

sed 's#<\?#<?php#' 

在一个管道中,为PHP加倍纠正:

sed 's#<\?#<?php#g' | sed 's#phpphp#php#g'