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

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

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

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

Ответы [ 7 ]

14 голосов
/ 02 июня 2011

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

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

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

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

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

1 голос
/ 08 июня 2017

Это возможно с обычным 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
1 голос
/ 25 мая 2011

use perl;

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

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

0 голосов
/ 25 мая 2011
sed -e :a -e '/^[ \n]*$/{$d;N;ba' -e '}' -e '$ s/\([^ ]\)*?>[ ]*/\1?>/' file.php > new_file.php

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

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

0 голосов
/ 25 мая 2011

Это работает на моем ящике:

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

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

0 голосов
/ 25 мая 2011

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

0 голосов
/ 25 мая 2011

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

...