2012-07-17 75 views
0

我需要搜索包含数字的文件中的某些行,然后在替换文件之前对这些数字进行一些操作。例如,假设我有这样一行:查找并替换使用函数来首先操作匹配

normal: { x: 50, y: 50 } 

我需要找到那行,除以2这两个数字,然后在该行更换号码和更新文件。我没有任何问题编写正则表达式来查找该行,并使用preg_replace_callback()编写了一个使用preg_replace_callback()来处理数字的PHP脚本,但是我需要能够替换数字,然后更新文件中的该行。我很乐意使用bash/sed/awk或者Ruby或者Python或者PHP,但是我不是那些专家。

我应该只是读取整个文件,然后我的replace_callbacks覆盖文件?

+0

我会说,一次读取整个文件,做一个正则表达式替换,并将整个文件写回到磁盘是最快的,你会得到。假设这些文件适合内存。 – 2012-07-17 14:29:27

回答

1

是的。你所建议的是最好的选择。 阅读整个文件,替换数字(您已经这样做了),然后写回整个文件。

如果你有一个非常大的文件,你可能会遇到麻烦,因为它不适合内存。 你当然可以扫描文件,只替换你需要替换的东西。 如果你想用文件句柄拨弄,并覆盖只需要覆盖字节(和先不谈文件的剩余部分),你可能会发现自己在这样的情况:

normal: { x: 10, y: 6 } 

即成为

normal: { x: 5, y: 3 } 

因此你丢失了一个字节,因为“10”变成了“5”。 :-) 在你的例子中,你可以用一个空格来代替,但是我不知道这是否会在你遇到的所有情况下都起作用。

总之:做你自己的建议:阅读,操作和回写。

0

你想读取字符串中的文件。使用preg_match获取要操纵的数字,然后对其进行处理。然后把这些数字放回字符串,并将整个文件写入文件。

1

用了preg_replace您可以通过类似这样的自定义函数替换内容..:
在这个例子中50将被发送到CNT功能,计算和值发送回替换功能..:

<?php 
function cnt($x){ 
    return $x/2; 
} 

$txt="normal: { x: 50, y: 50 }"; //Replace this with content of your file 
$x=preg_replace("/(normal: { x:)(\d+)(, y:)(\d+)(})/e", "'\\1'.cnt(\\2).'\\3'.cnt(\\4).'\\5'", $txt); 
echo $x; //Output: normal: { x: 25, y: 25 } 
?>