Найти дополнительное пространство/новую строку после закрытия?> (Тег php)

Итак, у меня есть пробел/новая строка после закрытия? > (тег php), который нарушает мое приложение.

Как я могу легко найти, у меня есть 1000 файлов и 100000 строк кода в этом приложении.

В идеале im после некоторого регулярного выражения в сочетании с find grep для запуска в unix-окне.

Ответ 1

Проблема здесь в нормальном grep не соответствует нескольким строкам. Итак, я бы установил pcregrep и попробовал следующую команду:

pcregrep -rMl '\?>[\s\n]+\z' *

Это будет соответствовать всем файлам в папке и подпапках (часть -r) с использованием многострочного соответствия PCRE (часть -M) и только перечислять их имена файлов (часть -l).

Что касается шаблона, который соответствует ?>, за которым следуют 1 или более символов пробелов или символов новой строки, а затем конец файла \z. Я обнаружил, что, когда я запускал это в своей папке, многие из файлов PHP фактически заканчиваются одной новой строкой. Таким образом, вы можете обновить это регулярное выражение до '\?>[\s\n]+\n\z' для сопоставления файлов с пробелами над одиночным терминатором символов \n.

Наконец, вы всегда можете использовать od -c filename для печати недвусмысленного представления файла, если вам нужно проверить его точное окончание символьной последовательности.

Ответ 2

использовать perl;

perl -0777 -i -pe 's/\s*$//s' *.php
  • -0777 будет клонировать весь файл (-0 тоже будет нормально)
  • -i - редактирование inplace, поэтому файл будет заменен результатом
  • -p печатать строки
  • -e выражение perl

s/\ s * $//s - обрабатывать все строки как одну строку и заменять любое пространство в конце на ничего

Ответ 3

Это возможно с помощью регулярного grep

grep -Pz '\?>[\s]+$' -Rl

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

  • -P Интерпретировать шаблон как совместимое с Perl регулярное выражение (PCRE).
  • -z Рассматривает входной файл как одну длинную строку - это отчасти то, что заставляет его работать.
  • [\s]+ соответствует хотя бы одному пробелу - включая новые строки

Если вы хотите только сопоставлять файлы PHP:

find -name '*.php' | xargs grep -Pz '\?>[\s]+$' -l

Для поиска пробелов в начале файла перед

find -name '*.php' | xargs grep -Pz '^[\s]+<\?' -l

Ответ 4

Это работает в моей коробке:

for i in `find . -name "*.php"`; do (echo -n "$i: "; tail -c 3 $i) | grep -v "[?]>"; done

Идея состоит в том, что вы берете только последние 3 символа с хвостом, а затем отбрасываете файлы там, где это "?", " > " и "новая линия". Если есть пробел или другая новая строка, вы не получите '?' характер..

Ответ 5

sed -e :a -e '/^[ \n]*$/{$d;N;ba' -e '}' -e '$ s/\([^ ]\)*?>[ ]*/\1?>/' file.php > new_file.php

для каждого файла, который не полностью протестирован.

не забудьте работать с временным файлом и после операции sed копировать новый файл на оригинале.

Ответ 6

Это работает для меня...

<\?php | \?>

Если вам нужно использовать внутри в файле настроек sublime-settings или что-то в этом роде, которое не любит прямые косые черты, вам, возможно, придется добавить дополнительную косую черту для каждого из них, например так...

<\\?php | \\?>

Надеюсь, это поможет!

Ответ 7

Используя блокнот ++, вы можете легко заменить все документы одновременно, перетащить и отбросить эту папку файлов и нажать CTRL + R, также вы можете использовать Regex

Ответ 8

grep '?> ' *.php? Разумеется, это может быть не просто пространство и может быть чередой или вкладкой, поэтому вы можете попробовать другие символы.