关闭后找到额外的空格/新行?> (php标签)

时间:2011-05-25 15:00:47

标签: php regex unix find grep

关闭后我有一个空格/新行?> (php标签)破坏了我的应用程序。

如何轻松找到它我在这个应用程序中有1000个文件和100000行代码。

理想情况下,在一些正则表达式结合使用find grep以在unix框上运行之后。

9 个答案:

答案 0 :(得分:14)

这里的问题是正常的grep与多行不匹配。所以,我会安装pcregrep并尝试以下命令:

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

这将使用PCRE多行匹配(-r部分)匹配文件夹和子文件夹(-M部分)中的所有文件,并仅列出其文件名(-l部分)

对于模式,匹配?>后跟1个或多个空格或换行符,然后是文件\z的结尾。我发现,当我在我的文件夹上运行它时,许多PHP文件确实以一个换行结束。因此,您可以将该正则表达式更新为'\?>[\s\n]+\n\z',以匹配单个\n字符终止符之上和之上的空白文件。

最后,如果您需要检查其确切的字符序列结尾,您始终可以使用od -c filename打印文件的明确表示。

答案 1 :(得分:1)

使用perl;

perl -0777 -i -pe 's/\s*$//s' *.php
  • -0777会玷污整个文件(-0也可以)
  • -i - 就地编辑,因此文件将替换为结果
  • -p print lines
  • -e perl expression

s / \ s * $ // s - 将所有行视为一行,并将末尾的任何空格替换为空

答案 2 :(得分:1)

这可以使用常规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

答案 3 :(得分:0)

这适用于我的方框:

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

这个想法是你只用尾巴的最后3个字符,然后丢弃那些'?','&gt;'的文件和换行符。如果有空格或其他换行符,您将无法获得'?'字符..

答案 4 :(得分:0)

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

对未完全测试的每个文件执行..

记得处理一个临时文件,然后在sed操作后复制原始文件上的新文件..

答案 5 :(得分:0)

这对我有用...

<\?php | \?>

如果您需要在sublime-settings文件中使用或不喜欢正斜杠的文件,则可能需要为每个斜杠添加一个额外的斜杠,就像这样...

  

<\\?php | \\?>

希望有帮助!

答案 6 :(得分:0)

这对我有用,可以在php文件之前找到空格

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

答案 7 :(得分:-2)

使用notepad ++你可以同时轻松替换所有文件,放下并删除文件夹并按CTRL + R,也可以使用Regex

答案 8 :(得分:-2)

grep '?> ' *.php?当然,它可能不是空格,可能是换行符或制表符,因此您可能想尝试其他字符。