如何只搜索和替换文本文件?

时间:2010-08-17 15:20:12

标签: perl

我有一个包含一堆文件的目录,一些文本是二进制的,没有一致的命名。我想只搜索和替换文本文件中的字符串。所以我选择了:

perl -i -pne 's#/some/text/to/replace#/replacement/text#' *

删除-i选项,您将看到二进制文件被捕获。如何修改此单行以跳过二进制文件?

2 个答案:

答案 0 :(得分:3)

ack -n --text --sort -f . | xargs perl -i -pne 's…'

滥用ack比使用-T编写自己的解决方案要快得多。

答案 1 :(得分:2)

嗯,这完全基于您对文本文件的定义。 Perl 5有-T filetest operator,它会告诉你文件名或文件句柄是否是文本文件(使用Perl 5的定义):

perl -i -pne 'BEGIN{@ARGV=grep-T,@ARGV}s#regex#replacement#' *

BEGIN块将过滤掉所有未通过-T测试的文件,因此甚至不会读取它们(除了第一个块,因为它是{{1}用于确定它们是否是文本)。

来自perldoc -f -X

  

-T和-B开关的工作原理如下。检查文件的第一个块是否有奇数字符,例如奇怪的控制代码或高位设置的字符。如果找到太多奇怪的字符(> 30%),则它是-B文件;否则它是一个-T文件。此外,第一个块中包含零字节的任何文件都被视为二进制文件。如果在文件句柄上使用-T或-B,则检查当前IO缓冲区而不是第一个块。在测试文件句柄时,-T和-B在空文件或EOF文件中返回true。因为您必须读取文件才能进行-T测试,所以在大多数情况下,您首先要对文件使用-f,如下所示,除非-f $ file&& -T $文件。