Измените код 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 это правильно распознано.

ЗАМЕТКИ

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

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

  • Как использовать определенную функцию с xargs
  • GNU параллельна чрезмерно медленной
  • Используйте массив bash в качестве списка аргументов в списке (с помощью Midnight Commander)
  • Использование xargs с git
  • find, xargs и mv: переименование файлов с двойными кавычками, расширение и проблема с приоритетом bash
  • Исправлен последний аргумент с xargs
  • Почему эта труба не заканчивается, когда процесс las умирает (зомби)?
  • Используйте команду find для выполнения ряда команд
  • Как объединить входы xarg с большим количеством аргументов?
  • отобразить результаты поиска
  • почему не xarss правильно разбирает мой вход?
  • Linux и Unix - лучшая ОС в мире.