我需要在包含数字的文件中搜索某些行,然后在替换文件之前对这些数字进行一些操作。例如,假设我有这样的一行:
normal: { x: 50, y: 50 }
我需要找到该行,将两个数字除以2,然后替换行中的数字并更新文件。我编写正则表达式找到该行没有问题,并使用preg_replace_callback()
编写了一个PHP脚本来操作数字,但我需要能够替换数字然后更新文件中的那一行。我很乐意使用bash / sed / awk或Ruby或Python或PHP,但我不是其中任何一位的专家。
我应该只读取整个文件,执行replace_callbacks
然后覆盖文件吗?
答案 0 :(得分:1)
是。你的建议是最好的选择。 读取整个文件,替换数字(您已经这样做了),并将整个文件写回来。
如果你有一个非常庞大的文件,你可能会遇到麻烦,因为它不适合内存。 当然,您可以扫描文件,只替换需要更换的文件。 如果你打算使用文件句柄,并且只覆盖你需要覆盖的字节(并保留文件的其余部分),你可能会遇到以下情况:
normal: { x: 10, y: 6 }
成为
normal: { x: 5, y: 3 }
因此你丢失了一个字节,因为“10”变为“5”。 :-) 在您的示例中,您可以使用空格,但我不知道这是否适用于您将遇到的所有情况。
简而言之:做你自己提出的建议:阅读,操纵和回写。
答案 1 :(得分: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 }
?>
答案 2 :(得分:0)
您想要以字符串形式读取文件。使用preg_match获取您想要操作的数字,然后操纵它们。然后将这些数字放回字符串并将整个内容写入文件。