2014-07-22 36 views
0

我正在開發一個項目,並且由於一個簡單但非常不幸的錯誤,需要重寫一堆文件中的時間戳;具體地講,我需要每個時間戳的最後一部分,並通過30將其劃分。例如,如果該文件包含:查找並替換perl regex包括數學

"blahblahblah[00:05:25]randomblah[01:22:13]"

然後我需要它說

"bahblahblah[00:05:833]randomblah[01:22:433]"

在意識到純正則表達式無法處理探針,因爲它只處理字符而不處理數字,一點點的使用Google指向一個Perl單線程,我試圖修改以符合我的目的。這是我到目前爲止有:

perl -pi.bak -e 's/\d\d:\d\d:($1/30)!/e

不過,我有一個語法錯誤"around /30"。任何人都可以幫助解決這個問題,並闡明它是如何工作的?我得到了逐行的東西,但不是表達式的一部分。謝謝!

+0

在你要運行到/是你的分隔符的問題最小的 - 你試圖做'S//e',但你給perl的'S//30/e',這是太多的論據。嘗試轉義第二個斜槓:'($ 1 \/30)'。 – zebediah49

+0

你想要數字*舍入*還是*截斷*?例如,你想用'[01:01:966]'還是'[01:01:967]'替換'[01:01:29]'?你正在運行什麼版本的Perl? – Borodin

回答

0

你提出的解決方案

perl -pi.bak -e 's/\d\d:\d\d:($1/30)!/e 

不會爲一些原因工作;主要是您的替代品s///沒有兩個適當的參數。在它的表面上,你想要替換\d\d:\d\d:($130)!匹配的東西。

我不清楚你的感嘆號!的意思,但我認爲你打算更多的東西一樣

perl -pi.bak -e 's{(\d\d:\d\d:)(\d\d)}{$1.$2/30}eg' 

其中,保存並恢復前兩個字段和30分不幸的是第三場這是不正確的,因爲它給你

97blahblahblah[00:05:0.833333333333333]randomblah[01:22:0.433333333333333] 

與您的示例數據。

所以,你需要除以30後的商的前三位數。如果你想最接近整數,並且你有一個相當新的Perl版本,這種單線解決方案應該適合你。它將修改後的文本打印到STDOUT。如果你想修改文件,你可以添加-i.bak,就像你自己的版本一樣。

perl -pe's{\d\d:\d\d:\K(\d\d)}{sprintf "%.0f", $1/30*1000}ge' myfile 
0

您可以使用備用分隔符,如s!!!。您需要2個捕獲組:一個小時:分鐘,另一個用於修改的秒數。您需要使用g修飾符來更改線上的所有實例。請參閱s/PATTERN/REPLACEMENT/ in perlop

use warnings; 
use strict; 

$_ = 'blahblahblah[00:05:25]randomblah[01:22:13]'; 
s!(\d{2}:\d{2}:)(\d{2})!$1 . int(1000*$2/30)!ge; 
print "$_\n"; 

__END__ 

blahblahblah[00:05:833]randomblah[01:22:433] 
+0

OP有一個'perl -pe'...''命令行不起作用。我認爲這樣做太過分了,不太有用。'\ d \ d'比'\ d {2}'更簡短,但是後者的顯式語義使它成爲一個緊密的調用 – Borodin