2017-02-22 76 views
0

我在文件的第4行有日期和時間在下述格式的文本文件:刪除的日期和時間,從文本文件

[0x1FFD]  LOG     2017/02/22 06:20:48.644 Diagnostic Version        Length: 0149            255 

現在,我已經刪除了字符串「2017年/ 02/22 06:20:48.644「。

此日期和時間不是恆定的,每當我保存文件(它需要的當前日期和時間)會發生變化。

由於我不是一個Perl編碼器,我發現很難找出路。

注意:我需要做的只是輸入文件的變化。我不需要創建一個單獨的輸出文件。

在此先感謝!

+0

你也許可以讀取該文件,然後使用正則表達式就可以搜索和替換它的時間戳。 – Mohit

+0

能否請您建議的正則表達式來獲取時間和日期 – gollusingh09

+1

如果格式_always_一樣的,這裏是一個簡單的版本:'$線=〜S | \ d {4}/\ d {2}/\ d { 2} \ d {2}:\ d {2}:\ d {2} \。\ d {3} ||;'。你通過行('while(<$fh>)'),獲得上述正則表達式,然後將該行寫入新文件。如果沒有匹配(一行中沒有日期),那麼在正則表達式中沒有任何反應,並且該行沒有改變,即。複製。處理完文件後,您將覆蓋原始文件(使用'File :: Copy'中的'move')。你不能「編輯」原始文件,你必須寫出一個新文件,然後複製原件。 – zdim

回答

2
use strict; 
use warnings; 
my $str = " [0x1FFD]  LOG   2017/02/22 06:20:48.644 Diagnostic Version  and more stuff"; 
$str =~ s|\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}\.\d{3}||; 
print $str; 

如果它在一個文件中,您需要遍歷該文件並打印每行以排除日期。

像這樣

use strict; 
use warnings; 
open FILE, "<", "filename.log" or die $!; 
my @list = <FILE>; 
foreach my $str(@list) { 
    $str =~ s|\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}\.\d{3}||; 
    print $str; 
} 
close(FILE); 

所以,從那裏你可以弄清楚如何將它寫回原來的文件。 :)

+1

第二個///'將在所有具有兩個空格的行上用一個空格替換任何兩個空格 - 即使是那些沒有被第一個///所匹配的空格。註釋。使用'打開我的$ fh,...'比'FILE'或者更好。正則表達式中的任何文字空間都很難閱讀,而且兩個彼此相鄰。或許使用'\ x20',或'\ N {SPACE}'或者'[]'(字符類:) – zdim

+0

@zdim,是的,我做/// g'的唯一原因是通過消除字符串中的一些空格來顯示結果。感謝您的其他建議,將更改代碼並測試:) – 2017-02-22 09:57:57

+0

還有一條評論。由於該文件是在列表上下文中讀取的,所以'close(FILE)'就在此之後,_before_循環之前。這可能很重要,因爲這樣OP會重定向輸出來覆蓋同一個文件。所以在我們開始打印之前最好關閉它。 (打印到終端可能是線路緩衝的,所以當它們發生時它們就會正確運行,Shell的重定向被緩衝,但它可能會立即打開並截斷。)//另一種方法是打開輸出文件,讀取line-by並將其打印並在循環後將其移動到原始文件(文件句柄關閉後)。 – zdim

1

您可以使用Tie::File模塊在單次調用時更新輸入文件。

use warnings; 
use strict; 
use Tie::File; 

my $str = 'data1.txt'; 

tie my @lines, 'Tie::File', $str or die $!; 

my $joinLines = join "\n", @lines; 

無論是使用1號或2基於正則表達式修改

#1. $joinLines=~s/(LOG\s)(.*?)(\sDiagnostic Version)/$1$3/g; 
#2. $joinLines =~ s/\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}\.\d{3}//; 


print $joinLines; 

@lines = split /\n/, $joinLines; 

untie @lines; 

請檢查和測試你的結束。