如何在文件中使用perl和regex/sed更改值?

如何在文件中使用perl和regex/sed更改值?,perl,Perl,我很确定我在做一些愚蠢的事情,我为此提前道歉。我看过其他类似搜索中建议的一行程序,我喜欢它们的想法,只是不知道如何应用,因为它不是直接交换。如果答案是这无法实现,那么这很好,我将围绕这一点编写脚本 问题是:我需要通过解析器发送日志文件,该解析器要求日期为YYYY-MM-DD。文件可以通过这种方式保存;但是,有些人喜欢在YYYY/MM/DD中查看它们,并将它们发送给我。我可以用sed修改一两个日期,效果很好;然而,当文件中有2-3年以上的时间时,最好不要为每个日期手动执行 我的代码(我已保留调试命

我很确定我在做一些愚蠢的事情,我为此提前道歉。我看过其他类似搜索中建议的一行程序,我喜欢它们的想法,只是不知道如何应用,因为它不是直接交换。如果答案是这无法实现,那么这很好,我将围绕这一点编写脚本

问题是:我需要通过解析器发送日志文件,该解析器要求日期为YYYY-MM-DD。文件可以通过这种方式保存;但是,有些人喜欢在YYYY/MM/DD中查看它们,并将它们发送给我。我可以用sed修改一两个日期,效果很好;然而,当文件中有2-3年以上的时间时,最好不要为每个日期手动执行

我的代码(我已保留调试命令):

使用严格;
使用文件::复制;
使用Getopt::Std;
我的%ARGS=();
getopts('f:v',\%ARGS);
my$file=$ARGS{f};
&main();
辅干管(元)
{

打开(FIN),您永远不会写入文件。使用
sed
,您将使用
-i
,并且您可以在Perl中执行完全相同的操作

perl -i -pe's{(\d{4})/(\d{2})/(\d{2})}{$1-$2-$3}g' file
或使用备份:

perl -i~ -pe's{(\d{4})/(\d{2})/(\d{2})}{$1-$2-$3}g' file
那相当于

local $^I = '';  # Or for the second:  local $^I = '~';
while (<>) {
   s{(\d{4})/(\d{2})/(\d{2})}{$1-$2-$3}g;
   print;
}

您从不写入文件。使用
sed
,您将使用
-i
,并且您可以在Perl中执行完全相同的操作

perl -i -pe's{(\d{4})/(\d{2})/(\d{2})}{$1-$2-$3}g' file
或使用备份:

perl -i~ -pe's{(\d{4})/(\d{2})/(\d{2})}{$1-$2-$3}g' file
那相当于

local $^I = '';  # Or for the second:  local $^I = '~';
while (<>) {
   s{(\d{4})/(\d{2})/(\d{2})}{$1-$2-$3}g;
   print;
}
用日志文件名替换输入。如果您需要原始数据,将创建备份文件input.bak


将输入替换为日志文件名。如果您需要原始数据,将创建备份文件input.bak。

在哪里写入文件…?不建议写入正在读取的同一文件。您可以写入临时文件,然后将该文件复制到原始文件上。您也可以尝试使用
sed
带有
-i
标志,它将就地修改文件。谢谢你们的反馈。这证实了我的疑问。我还没有弄清楚如何使它在多个日期使用sed。你在哪里写入文件…?不建议写入正在读取的同一个文件。你可以做的就是写入一个临时文件,然后将该文件复制到原始文件上。您也可以尝试使用带有
-i
标志的
sed
,这将在适当的位置修改该文件。谢谢你们的反馈。这证实了我的疑惑。我还没有弄明白如何使它在多个日期使用sed。谢谢!成功了。我能问一下吗t在“s”之后和“g”之前使用“|”而不是“/”?这是一种样式首选项还是它修改了脚本的行为?理论上,这应该可以放为shell脚本、别名或它自己的唯一.pl文件,这样我可以更容易地调用这一行程序?“|”允许在正则表达式中使用/而无需nee我想在它前面加一个反斜杠。与编写.pl文件相比,特殊标志使它作为一个一行程序更好,但是你肯定可以在shell脚本中使用相同的一行程序。谢谢!这样做了。我可以问一下在“s”之后和“g”之前使用“|”而不是“/”?这是一个样式首选项还是修改了脚本的方式aves?从理论上讲,这应该可以作为shell脚本、别名或它自己的唯一.pl文件来放置,这样我就可以更容易地调用这一行程序了?“|”允许在正则表达式中使用/而无需在其前加反斜杠\号。与编写.pl文件相比,特殊标志使其作为一行程序更好,但您可以定义首先,在shell脚本中使用相同的一行程序。