Regex删除文件中的最后一个PHP标记
我正在更新一些旧代码,注意到有很多文件仍然以旧式PHP文件结尾,其中Regex删除文件中的最后一个PHP标记,php,regex,sed,grep,Php,Regex,Sed,Grep,我正在更新一些旧代码,注意到有很多文件仍然以旧式PHP文件结尾,其中?>是文件中的最后一个字符 注意:这符合PHP的许多编码标准,例如: 有没有一种方法可以在整个目录范围内快速删除这些标记(通过preg\u replace,可能是grep/sed,或者其他什么),但不删除内嵌PHP块中的合法结束标记 查找/替换这些字符没有问题——但我不确定如何确保它是文件中的最后一个字符 谢谢首先,与所有批量搜索和替换任务一样,请确保您已备份了文件,以便在出现问题时可以依靠某些东西 然后,在命令行上,尝试: $
?>
是文件中的最后一个字符
注意:这符合PHP的许多编码标准,例如:
有没有一种方法可以在整个目录范围内快速删除这些标记(通过preg\u replace
,可能是grep
/sed
,或者其他什么),但不删除内嵌PHP块中的合法结束标记
查找/替换这些字符没有问题——但我不确定如何确保它是文件中的最后一个字符
谢谢首先,与所有批量搜索和替换任务一样,请确保您已备份了文件,以便在出现问题时可以依靠某些东西 然后,在命令行上,尝试:
$ sed -i '$s/\([[:blank:]]\)*?>\([[:blank:]]\)*$//g' "$(grep -rl '^\([[:blank:]]\)*?>\([[:blank:]]\)*$')"
- 使用包含grep命令的命令替换
$()
- grep
递归查找文件。如果您的目录中混入了非PHP文件,并且耗时太长,我们可以在-r
,但是现在请尝试此方法中查找
- grep
仅列出,不显示匹配项,因此将文件名传递给-l
命令sed
[:blank://code>是一个POSIX字符类,用于匹配空格或制表符
- 因此grep匹配一行,该行以空格或制表符开头,表示零+字符,
,后跟空格或制表符零+字符,然后是行尾?>
- 这是为了处理边缘情况,即代码没有像预期的那样仅以
结束,但由于任何奇怪的原因,在?>
前后都有额外的空格?>
<> LI>单独的GRIP也会包含不必要的结果,在PHP脚本的中间有自己的代码行> <代码> > >代码>,所以只关注文件的末尾,最后一行,我们有<代码> SED 。
替换到位。也可以使用-i
自动让sed创建-i.bak
文件备份,但我不希望web服务器中充斥*.bak
文件,如果在此之前按照我的建议进行备份,您已经有了备份,并且不需要此备份*.bak
- 以
开头的sed命令指定地址是最后一行$
- 然后,参与该地址的操作与grep所寻找的类似
- sed通过替换来执行操作,因此仍将保留一个空行,这至少确保符合
要求所有PHP文件必须以一个空行结尾。
- 如果您根本没有得到任何修复,可能是DOS与Linux行结束问题阻止了grep的工作,在这种情况下,您可能需要对PHP文件使用
,然后重试此命令dos2unix
结果是成功地消除了最后一行
?>
,即使在?>
之前或之后有额外的“不干净”空间。首先,与所有批量搜索和替换任务一样,请确保您已备份了文件,以便在出现问题时可以依靠一些东西
然后,在命令行上,尝试:
$ sed -i '$s/\([[:blank:]]\)*?>\([[:blank:]]\)*$//g' "$(grep -rl '^\([[:blank:]]\)*?>\([[:blank:]]\)*$')"
- 使用包含grep命令的命令替换
$()
- grep
递归查找文件。如果您的目录中混入了非PHP文件,并且耗时太长,我们可以在-r
,但是现在请尝试此方法中查找
- grep
仅列出,不显示匹配项,因此将文件名传递给-l
命令sed
[:blank://code>是一个POSIX字符类,用于匹配空格或制表符
- 因此grep匹配一行,该行以空格或制表符开头,表示零+字符,
,后跟空格或制表符零+字符,然后是行尾?>
- 这是为了处理边缘情况,即代码没有像预期的那样仅以
结束,但由于任何奇怪的原因,在?>
前后都有额外的空格?>
<> LI>单独的GRIP也会包含不必要的结果,在PHP脚本的中间有自己的代码行> <代码> > >代码>,所以只关注文件的末尾,最后一行,我们有<代码> SED 。
替换到位。也可以使用-i
自动让sed创建-i.bak
文件备份,但我不希望web服务器中充斥*.bak
文件,如果在此之前按照我的建议进行备份,您已经有了备份,并且不需要此备份*.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-表示文件结束
.*? - 匹配标签之间的所有内容