Измените код ASP на PHP-код во всех файлах

Я переношу каталог файлов, содержащих довольно простой код ASP, на PHP-сервер, и мне нужно изменить содержимое всех файлов с помощью механизма поиска и замены. Я не очень хорош с регулярными выражениями, но я использовал это, чтобы изменить несколько вещей уже:

find . -name "*.php" -print0 | xargs -0 -n 1 sed -i -e 's/oldstring/newstring/g' 

У меня есть некоторые сложные строки, которые мне нужно заменить. См. Следующее:

ИЗ:

 <% if request("page") = "" then %> 

TO:

 <?php if(!isset($_GET['page']) || !$_GET['page']){ ?> 

Это одно, * может быть любым числом, а затем содержать это число, где * находится на «TO».

ИЗ:

 <% elseif request("page") = "*" then %> 

TO:

 <?php } elseif($_GET['page'] == '*'){ ?> 

И последнее довольно просто. ИЗ:

 <% end if %> 

TO:

 <?php } ?> 

Если я могу запустить это навалом, рекурсивно в каталоге, это исправит 98% всего кода ASP в этих файлах. Я пытался избежать этих строк несколькими способами, но не могу понять, как заставить его работать. Любая помощь приветствуется!

One Solution collect form web for “Измените код ASP на PHP-код во всех файлах”

Существуют различные способы сделать это, я бы рекомендовал воспользоваться функцией quotemeta от Perl.

Сначала сделайте текстовый файл с разделителями, содержащий шаблоны поиска в первом столбце, и их замену во втором:

 $ cat pats.txt <% if request("page") = "" then %> <?php if(!isset($_GET['page']) || !$_GET['page']){ ?> <% elseif request("page") = "*" then %> <?php } elseif($_GET['page'] == '*'){ ?> <% end if %> <?php } ?> 

Я создал тестовый файл, содержимое которого:

 $ cat foo.asp <% if request("page") = "" then %> <% elseif request("page") = "*" then %> <% end if %> 

И Perl на помощь:

 find . -name "*.php" | while IFS= read -r file; do perl -i.bak -e 'open(A,"pats.txt"); while(<A>){chomp; @a=split(/\t/); $k{quotemeta($a[0])}=$a[1]} while(<>){ foreach $pat (keys(%k)){ s/$pat/$k{$pat}/; } print}' $file; done в find . -name "*.php" | while IFS= read -r file; do perl -i.bak -e 'open(A,"pats.txt"); while(<A>){chomp; @a=split(/\t/); $k{quotemeta($a[0])}=$a[1]} while(<>){ foreach $pat (keys(%k)){ s/$pat/$k{$pat}/; } print}' $file; done в find . -name "*.php" | while IFS= read -r file; do perl -i.bak -e 'open(A,"pats.txt"); while(<A>){chomp; @a=split(/\t/); $k{quotemeta($a[0])}=$a[1]} while(<>){ foreach $pat (keys(%k)){ s/$pat/$k{$pat}/; } print}' $file; done 

Флаг -i Perl работает так же, как в sed , вы можете указать дополнительный суффикс резервной копии. В приведенном выше примере для каждого обработанного файла будет создан файл с именем foo.php.bak . Используйте -i самостоятельно, если вы не хотите создавать резервные копии.

ОБЪЯСНЕНИЕ:

Сценарий будет читать шаблоны и замены и сохранять шаблоны в виде ключей хеша ( %k ), где заменой являются значения. Функция quotemeta все символы, отличные от ASCII (не соответствующие [A-Za-z_0-9] ).

Сценарий открывает второй файл, ищет каждый шаблон в каждой строке и соответственно заменяет. Так как шаблоны поиска были экранированы с помощью quotemeta это правильно распознано.

ЗАМЕТКИ

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

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

  • basename не работает должным образом
  • отобразить результаты поиска
  • Какова цель опции -I команды xargs?
  • копирование нескольких файлов в несколько каталогов
  • / usr / bin / awk: слишком длинный список аргументов
  • xargs, записи и стандартный ввод
  • Как вы можете перемещать или копировать определенные файлы из списка текстовых файлов
  • Как использовать определенную функцию с xargs
  • Получите дополнение к результату команды ls
  • Странная ошибка «Нет такого файла» с «xargs» и «file»
  • Почему xargs -I подразумевает -L 1
  • Interesting Posts

    В crontab можно указать пользователя из переменной?

    Можно ли использовать один SSH-ключ для каждой учетной записи для каждой учетной записи на данном удаленном сервере?

    Как установить g ++ 4.8 для установки по умолчанию после установки?

    Запустить программу OpenGl на удаленном сервере

    Скажем, у меня есть путь к файлу, как я могу ссылаться на каталог этого файла из командной строки?

    Укажите номера tty

    использовать только одну беспроводную карту для подключения к Wi-Fi сети и обмениваться Интернетом через Wi-Fi в то же время

    Данте аутентифицирующий пользователь

    Как установить минимальное разрешение экрана и максимальное разрешение xrandr для Exceed-on-Demand (EoD)

    gnuMake, Как переопределить переменную среды

    что означает «уровень выполнения процессора»?

    Почему ./configure дает мне неудовлетворенные пакеты, которых не существует?

    Можно ли использовать драйвер nvidia только в играх и нуво в любое другое время?

    Где начинается snmpwalk, если не указано OID?

    Как следить за потоками tcp непрерывно вдоль захвата с помощью tshark / wireshark?

    Linux и Unix - лучшая ОС в мире.