2012-07-17 74 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 } 
?>