2011-05-16 18 views
1

をファイルの束として<?phpにプログラムで置き換えようとしていますが、sed正規表現が期待どおりに動作していません。あなたは何が間違っているのか教えていただけますか?sedを使用して<? <?php

私はここに、コマンドライン上でそれをテストしています:

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

あなたの入力は何ですか、あなたの出力何である - 「テストケースは、」確かにそうしない –

答えて

3

を私はあなたのエスケープを必要とは思わない:?

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

を読み取ることは不可能であること。 –

+0

はい、あなたはそうしていると思います。あなたが投稿した解決策は、オプションの<、リテラルではない<? –

+0

多分sedのバージョンに依存しますが、使用しているバージョンの '\?'はオプションの文字限定子です。 http://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html –

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' 
関連する問題