我很確定我正在做一些愚蠢的事情,我提前道歉。我曾看過其他人在類似搜索中提出的單行,我喜歡他們的想法,但我不確定如何申請,因爲它不是直接交換。如果答案是不能做到的話,那很好,我會爲此編寫腳本。如何在文件內使用perl和regex/sed更改值?
問題:我有需要通過解析器發送的日誌文件,需要日期爲YYYY-MM-DD。這些文件可以這樣保存;然而,有些人更喜歡他們在YYYY/MM/DD爲他們自己的觀看,併發送給我。我可以用sed修改一個或兩個日期,並且這個工作很好。然而,當文件中有2-3年以上時,不必爲每個日期手動完成。
我的代碼(我留在原地調試命令):
use strict;
use File::Copy;
use Getopt::Std;
my %ARGS =();
getopts('f:v', \%ARGS);
my $file = $ARGS{f};
&main();
sub main($)
{
open (FIN, "<$file") || die ("Cannot open file");
print "you opened the file\n";
while (<FIN>) {
my $line = $_;
if ($line =~ /(\d*)\/(\d*)\/(\d*) /i) {
#print "you are in the if";
my $year = $1;
my $month = $2;
my $day = $3;
print $line;
print "\nyou have year $1\n";
print "you have month $2\n";
print "you have day $3\n";
s/'($1\/$2\/$3)/$1-$2-$3'/;
}
}
close FIN;
}
我可以看到,正則表達式是獲得正確的價值觀爲我的變量,但原來的線沒有在文件中被替換。
問題:
1)如果這是可以在同一個文件中做或我需要它輸出到不同的文件?看其他答案,相同的文件應該沒問題。 2)是否需要以另一種方式打開文件或以某種方式設置爲寫入文件,而不是像運行sed一樣運行replace命令?我擔心失敗可能會在這個簡單的地方,我可以忽略不計。
謝謝!
你在哪裏寫入文件...? – ikegami 2013-05-01 18:31:52
不建議寫入您正在閱讀的同一個文件。你可以做的是寫入一個臨時文件,然後將該文件複製到原始文件中。你也可以用'-i'標誌來嘗試使用'sed',這會在原地修改文件。 – 2013-05-01 18:40:42
謝謝你們倆的反饋。這證實了我在想什麼。我還沒有想出如何使它與多個日期的sed工作。 – user438596 2013-05-02 04:38:39