Regex 如何在perl中使用Grep删除行的特定结束字?

Regex 如何在perl中使用Grep删除行的特定结束字?,regex,perl,grep,shell,Regex,Perl,Grep,Shell,我每天都会创建一个文件,我想删除结尾字符为utc的行,并用perl输出到其他文件, 我尝试使用grep和regexp, 但获取错误消息如下所示 sh: -c: line 0: unexpected EOF while looking for matching `"' sh: -c: line 1: syntax error: unexpected end of file grep代码: system("grep -v \"utc$ \" /doc/$date/before > /doc/

我每天都会创建一个文件,我想删除结尾字符为utc的行,并用perl输出到其他文件, 我尝试使用grep和regexp, 但获取错误消息如下所示

sh: -c: line 0: unexpected EOF while looking for matching `"'
sh: -c: line 1: syntax error: unexpected end of file
grep代码:

system("grep -v \"utc$ \" /doc/$date/before > /doc/$date/after");
这个文件看起来像

config setting
^MMon Nov 13 10:45:52.401 utc   -->the line is I wnat to remove
start configuration...
clock timezone utc 8
有什么建议吗?在这一点上,我非常乐意尝试任何东西。

对于这样一项常见的任务,没有必要使用外部工具。它包括启动一个shell和另一个程序,以及(双重)正确地逃离事物;它容易出错,效率低得多,而且在错误检查方面也较差。为什么不在Perl程序中使用Perl

读取文件并将其行写入新文件,跳过不需要的行。例如,有关详细信息,请参见

下面是使用

模块的
路径($file)
打开文件并
返回行列表;它们通过
grep
进行过滤,那些不以
utc
结尾的(可能带有尾随空格)被分配到
@新行

然后,
spew
方法将这些行写入
$new\u文件

有关使用此模块“编辑”文件的两种(其他)方法,请参阅


一行

perl -ne'print if not /utc\s*$/' file  > new_file

直接回答可能最能说明(某些)使用外部命令的缺点

我们需要通过shell将特定的序列传递给
grep
,这些序列将由Perl和shell中的一个或两个来解释;因此,它们需要正确地转义

system("grep -v 'utc\\s*\$' $old_file > $new_file");
这适用于我的系统。

首先:简单的perl 从


will get“/doc/是一个目录,它无法获取变量$date您想做什么?
什么必须包含
$date`变量?该变量将设置在哪里?
“utc$”
的含义是什么(符号美元后跟空格)?您的文件是如何命名的,路径名称?请发布路径示例,可能还有内容!因为我每天都会创建一个文件,所以日期是可变的。路径是/doc/$date/之前,$date是可变的。我想您最好使用
-p
标志。
perl-pe'下一步如果m/utc$/”文件
就可以了。@Sobrique嗯?这里的
-next
的目的是什么?我想
-p
总是打印行,没有办法阻止。我错了吗?
-p
只是插入一个
continue
块来打印
$。
-next
@Sobrique这样的循环控制语句可以绕过它。而e say“因此,它可以用于增加循环变量,即使循环已通过下一个语句继续“。对我来说,这听起来好像总是执行continue块。嗯,好的。我被纠正了。我显然糊涂了。我会去复习的,因为我至少相当肯定
-p
中有一个“跳过”选项。我去弄清楚是什么。
system("grep -v 'utc\\s*\$' $old_file > $new_file");
perl -e 'opendir DH,"/doc";foreach my $date (readdir DH) {
   if (-f "/doc/".$date."/before") { open RH,"</doc/".$date."/before";
     open WH,">/doc/".$date."/after";while(<RH>){print WH $_ unless /utc$/;};};
   close RH;close WH;};closedir DH;'
#!/usr/bin/perl -w

my $docPath="/doc";
opendir DH,$docPath;
foreach my $date (readdir DH) {
    if (-f $docPath."/".$date."/before") {
        open RH,"<".$docPath."/".$date."/before";
        open WH,">".$docPath."/".$date."/after";
        while(<RH>){
            print WH $_ unless /utc$/;
        };
    };
    close RH;
    close WH;
};
closedir DH;
#!/usr/bin/perl -w

use Path::Tiny;

my $docPath=path("/doc");

foreach my $date ($docPath->children) {
    $date->child("after")->spew(
    grep {!/utc$/} $date->child("before")->lines );
}