\f
是Perl中的换页符。这些格式错误的文件似乎是由Perl和XML的新手创建的。
这是一个Perlier修复程序-它也满足了OP自动更新所有文件的目标,这与sed可接受的答案不同,因为sed一次只能与一个文件配对,因此只能使用一个文件find
。
\f
本身可以简单地代替十六进制代码使用x0c
。
find . -type f -exec perl -pi.bkp -e 's [ \f ilename ][ /f ilename ]gx' {} \;
在这里,我已经添加-type f
到tel中find
,只返回普通文件-否则find
将返回.
列表,并在尝试编辑它时触发警告,尽管其他所有操作仍然可以进行。
通过使用x
忽略真实空格的标志,我还使正则表达式更易于查看,从而使您可以将正则表达式的元素隔开。如果您不喜欢这样,这里就没有:
find . -type f -exec perl -pi.bkp -e 's[\filename][/filename]g' {} \;
并且在所有可能的换页字符都是虚假的情况下,所有字符都应替换为/f
,那么您可以进一步缩小单行格式:
find . -type f -exec perl -pi.bkp -e 's[\f][/f]g' {} \;
您不需要使用正斜杠将s///
Perl中的regex替换命令的元素()括起来。您可以使用任何符号。但是,如果选择使用任何一种成对的类似括号的符号,则必须同时使用它们:s[old][new]
例如。
由于我不使用斜杠,因此我不必转义任何斜杠。
至于-i.bkp
:perl -pi -e
让您就地编辑-但是如果您想要额外的保险以防万一您发现并替换了Perl程序错误,则可以放入文件扩展名,以便为该文件复制原始文件。您。在这里,我用过.bkp
。
在最新版本的Perl中,就地编辑已更新为更具弹性,以防您的系统也遇到严重的问题,例如断电或磁盘空间不足。这是Perl的作者brian d foy在最近的Perls中改进的就地编辑。
您应该考虑使用Perl对于这些类型的任务,因为它是一个非常强大但被低估的通用编程语言,其最初的设计目标是取代的一个sed
,并awk
与东西要好得多。
Perl 5的regex匹配功能和改进的regex语法远远超过了sed
,awk
以及除Perl 6之外的所有其他编程语言,使Perl成为简单和高级regex操作的最明智的选择。
需要说明的是:sed
也可以正常工作find
,您还可以使用sed -i.bkp
它为每个编辑过的文件做备份,但据我所知,它在Perl 5.28及更高版本中没有额外的弹性。它还使用了笨拙且功能较弱的传统UNIX®正则表达式语法。
<\filename>
而不是</filename>
在上下文\f
中将其解释为换页符。您可能应该跟踪这些文件的来源,并向开发人员指出其生成工具的问题。对于修复文件,可以接受答案。