0

我需要在文件中搜索包含数字的某些行,然后在将它们替换到文件中之前对这些数字进行一些操作。例如,假设我有这样的一行:

normal: { x: 50, y: 50 }

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

我应该只读入整个文件,replace_callbacks然后覆盖文件吗?

4

3 回答 3

1

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

如果你有一个非常大的文件,你可能会遇到麻烦,因为它不适合内存。你当然可以,扫描文件,只替换你需要替换的。如果您要摆弄文件句柄,并且只覆盖您需要覆盖的字节(并且不理会文件的其余部分),您可能会发现自己处于以下情况:

normal: { x: 10, y: 6 }

成为

normal: { x: 5, y: 3 }

因此你丢失了一个字节,因为“10”变成了“5”。:-) 在您的示例中,您可以改用空格,但我不知道这是否适用于您遇到的所有情况。

简而言之:做你自己建议的事情:阅读、操作和回写。

于 2012-07-17T14:36:52.687 回答
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 }
?>
于 2012-07-17T14:45:14.697 回答
0

您想以字符串形式读取文件。使用 preg_match 获取您想要操纵的数字,然后操纵它们。然后将这些数字放回字符串并将整个内容写入文件。

于 2012-07-17T14:30:56.920 回答