2017-02-22 80 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; 

请检查和测试你的结束。