Regex删除文件中的最后一个PHP标记

Regex删除文件中的最后一个PHP标记,php,regex,sed,grep,Php,Regex,Sed,Grep,我正在更新一些旧代码,注意到有很多文件仍然以旧式PHP文件结尾,其中?>是文件中的最后一个字符 注意:这符合PHP的许多编码标准,例如: 有没有一种方法可以在整个目录范围内快速删除这些标记(通过preg\u replace,可能是grep/sed,或者其他什么),但不删除内嵌PHP块中的合法结束标记 查找/替换这些字符没有问题——但我不确定如何确保它是文件中的最后一个字符 谢谢首先,与所有批量搜索和替换任务一样,请确保您已备份了文件,以便在出现问题时可以依靠某些东西 然后,在命令行上,尝试: $

我正在更新一些旧代码,注意到有很多文件仍然以旧式PHP文件结尾,其中
?>
是文件中的最后一个字符

注意:这符合PHP的许多编码标准,例如:

有没有一种方法可以在整个目录范围内快速删除这些标记(通过
preg\u replace
,可能是
grep
/
sed
,或者其他什么),但不删除内嵌PHP块中的合法结束标记

查找/替换这些字符没有问题——但我不确定如何确保它是文件中的最后一个字符


谢谢

首先,与所有批量搜索和替换任务一样,请确保您已备份了文件,以便在出现问题时可以依靠某些东西

然后,在命令行上,尝试:

$ sed -i '$s/\([[:blank:]]\)*?>\([[:blank:]]\)*$//g' "$(grep -rl '^\([[:blank:]]\)*?>\([[:blank:]]\)*$')"
  • 使用包含grep命令的命令替换
    $()
  • grep
    -r
    递归查找文件。如果您的目录中混入了非PHP文件,并且耗时太长,我们可以在
    中查找
    ,但是现在请尝试此方法
  • grep
    -l
    仅列出,不显示匹配项,因此将文件名传递给
    sed
    命令
  • [:blank://code>是一个POSIX字符类,用于匹配空格或制表符
  • 因此grep匹配一行,该行以空格或制表符开头,表示零+字符,
    ?>
    ,后跟空格或制表符零+字符,然后是行尾
  • 这是为了处理边缘情况,即代码没有像预期的那样仅以
    ?>
    结束,但由于任何奇怪的原因,在
    ?>
    前后都有额外的空格
  • <> LI>单独的GRIP也会包含不必要的结果,在PHP脚本的中间有自己的代码行> <代码> > >代码>,所以只关注文件的末尾,最后一行,我们有<代码> SED 。
  • -i
    替换到位。也可以使用
    -i.bak
    自动让sed创建
    *.bak
    文件备份,但我不希望web服务器中充斥
    *.bak
    文件,如果在此之前按照我的建议进行备份,您已经有了备份,并且不需要此备份
  • $
    开头的sed命令指定地址是最后一行
  • 然后,参与该地址的操作与grep所寻找的类似
  • sed通过替换来执行操作,因此仍将保留一个空行,这至少确保符合
    所有PHP文件必须以一个空行结尾。
    要求
  • 如果您根本没有得到任何修复,可能是DOS与Linux行结束问题阻止了grep的工作,在这种情况下,您可能需要对PHP文件使用
    dos2unix
    ,然后重试此命令

结果是成功地消除了最后一行
?>
,即使在
?>

之前或之后有额外的“不干净”空间。首先,与所有批量搜索和替换任务一样,请确保您已备份了文件,以便在出现问题时可以依靠一些东西

然后,在命令行上,尝试:

$ sed -i '$s/\([[:blank:]]\)*?>\([[:blank:]]\)*$//g' "$(grep -rl '^\([[:blank:]]\)*?>\([[:blank:]]\)*$')"
  • 使用包含grep命令的命令替换
    $()
  • grep
    -r
    递归查找文件。如果您的目录中混入了非PHP文件,并且耗时太长,我们可以在
    中查找
    ,但是现在请尝试此方法
  • grep
    -l
    仅列出,不显示匹配项,因此将文件名传递给
    sed
    命令
  • [:blank://code>是一个POSIX字符类,用于匹配空格或制表符
  • 因此grep匹配一行,该行以空格或制表符开头,表示零+字符,
    ?>
    ,后跟空格或制表符零+字符,然后是行尾
  • 这是为了处理边缘情况,即代码没有像预期的那样仅以
    ?>
    结束,但由于任何奇怪的原因,在
    ?>
    前后都有额外的空格
  • <> LI>单独的GRIP也会包含不必要的结果,在PHP脚本的中间有自己的代码行> <代码> > >代码>,所以只关注文件的末尾,最后一行,我们有<代码> SED 。
  • -i
    替换到位。也可以使用
    -i.bak
    自动让sed创建
    *.bak
    文件备份,但我不希望web服务器中充斥
    *.bak
    文件,如果在此之前按照我的建议进行备份,您已经有了备份,并且不需要此备份
  • $
    开头的sed命令指定地址是最后一行
  • 然后,参与该地址的操作与grep所寻找的类似
  • sed通过替换来执行操作,因此仍将保留一个空行,这至少确保符合
    所有PHP文件必须以一个空行结尾。
    要求
  • 如果您根本没有得到任何修复,可能是DOS与Linux行结束问题阻止了grep的工作,在这种情况下,您可能需要对PHP文件使用
    dos2unix
    ,然后重试此命令

结果是成功地消除了最后一行
?>
,即使在
?>

之前或之后有额外的“不干净”空间,我最近也遇到了非常类似的问题。为了解决这个问题,我决定在Notepad++中替换.php文件的内容

1) 首先备份工作目录中的所有文件 2) 其次,在notepad++中使用以下正则表达式替换所有.php文件:

(?s)\A(\s+)?<\?(php)?(.*?)\?>(\s+)?\Z
(?s)\A(\s+)(\s+)\Z
替换为:

<?\2\3
。 此外,它还删除标记前后的空格。如果不希望出现此行为,请从正则表达式中删除
(\s+)
部分

\A-表示文件的开头 \s-匹配空格 \Z-表示文件结束 .*? - 匹配标签之间的所有内容