2016-11-15 4 views
2

У меня есть действительно старый код (php 5.1), который должен запускаться на более новом сервере.Sed заменить <? с <? php

Новый сервер имеет PHP 5.6, поэтому любые области, где

<? 

используется, чтобы открыть контекст PHP, тем не интерпретируются правильно. Мне нужно заменить все экземпляры

<? 

с

<?php 

кроме где

<? 

уже является частью

<?php 

Мои усилия были Начальное использовать обратные ссылки и СЭД:

cat file.php | sed -i 's/<?([^php])/<?php\$1/g' 

Однако,(), кажется, разорвать матч, и без него я не могу иметь надлежащую обратную ссылку.

Я пытался получить то, что было после того, как PHP открывающий тег в обратной ссылки, так что я мог повернуть линии, как:

<?=$_COOKIE... 

в

<?php=$_COOKIE... 

И, пожалуйста, не направляйте меня: Using sed to replace <? with <?php. Я уже видел это, и это не касается того факта, что у меня уже есть новый тег открытия в некоторых местах, а старый - в других. (Один из ответов вроде бы, но я бы предпочел не создавать «phpphphphpphp» и искать его снова и снова, чтобы уменьшить его до «php».

Наконец, пожалуйста, простите, . Так может не отображать их в соответствии с текстом, только если они находятся в блоке кода

+2

'[^ php]' не соответствует тексту, не равному 'php', он соответствует только 1 символу, который является либо' p', либо 'h'. ИМХО, вы не можете сделать это с надежным sed, поскольку он не поддерживает поисковые запросы. –

+1

Правильное регулярное выражение woulld должно быть чем-то вроде этого '<\? (?! php)', но, как указано в WiktorStribiżew, 'sed' не поддерживает отрицательные образы. –

+0

Я не знал, что он не поддерживает негативные образы. Похоже, мне придется записывать это на Python ... спасибо, господа. – DrDamnit

ответ

1

Вы можете сделать:.

sed 's/<?\(php\)*/<?php/g' file 

в этом случае «PHP» не является обязательным, но систематически перезаписаны, если это уже здесь

Или используя черно-белый характер г, как следует AbraCadaver так как кажется, являются обязательным после короткого тэга:

sed 's/<?\([[:space:]]\)/<?php\1/g' file 

Ограничения: эта модель не может знать, если <? или <?php находится внутри строки.Пример:

echo 'abc <? def'; 

становится:

echo 'abc <?php def'; 

Лучший способ заключается в использовании самого PHP с tokenizer.

пример:

$str = 'echo "blah"; <? echo "sblub"; ?> bluh'; 

$result = ''; 

foreach(token_get_all($str) as $tok) { 
    $result .= ($tok[0] == 376) ? '<?php' : $tok[1]; 
} 

echo $result; 
+0

Я не знаю SED, но почему бы не заменить' AbraCadaver

+0

, потому что иногда там пробелы, а иногда нет. – DrDamnit

+0

@AbraCadaver: Это хорошая идея с '[[: blank:]]' вместо '\ s', но я не помню, было ли разрешено' 'Или нет. –

0

вы можете попробовать это https://regex101.com/r/tMkwCT/1

регулярное выражение:

^<\?([^p\=])/gm 

замена:

<?php$1 

ехр lanation:
^ утверждает положение в начале строки
< соответствует символу < буквально (чувствительно к регистру)
\? соответствует символу? в буквальном смысле (чувствительно к регистру)
первая группа записи ([^ р \ =])
Match один символ не присутствует в списке ниже [^ р \ =]
р соответствует символу р буквально (чувствительно к регистру)
\ = соответствует символу = буквально (с учетом регистра)
Глобальные шаблонные флаги
g модификатор: глобальный. Все совпадения (не возвращаются после первого совпадения)
m модификатор: многострочный. Причины^и $, чтобы соответствовать начать/конец каждой строки (а не только начать/конец строки)

вы можете изменить для SED сценария

или вы можете включить short_open_tag http://php.net/manual/en/language.basic-syntax.phptags.php

PHP also allows for short open tag <? (which is discouraged since it is only available if enabled using the short_open_tag php.ini configuration file directive, or if PHP was configured with the --enable-short-tags option).

обновление:
- https://regex101.com/r/tMkwCT/4 по @SamuelAialaFerreira
- https://regex101.com/r/tMkwCT/7 - удаление^так будет проверить, если открыта код не находится в начале строки

+0

Это почти сработало для меня. Я пытаюсь запустить этот скрипт в гигантской папке, и в этих двух случаях они не работали

+1

Я также изменил er на^<\? ([^ PP \ =]), потому что вы могли бы получить

Смежные вопросы