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



我每天都会创建一个文件,我想删除结束字符是utc的行并输出到perl中的其他文件, 我尝试使用 grep 一个正则表达式, 但得到错误消息如下,

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

格雷普代码 :

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呢?

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

这是使用路径::微小的快速方法

use warnings;
use strict;
use Path::Tiny;
my $file     = '...';
my $new_file = '...';
my @new_lines = grep { not /utcs*$/ } path($file)->lines; 
path($new_file)->spew(@new_lines);

模块的path($file)打开文件并返回lines行列表;它们按grep过滤,那些不以utc结尾(可能有尾随空格)的行被分配给@new_lines

然后spew方法将这些行写入$new_file

有关使用此模块"编辑"文件的几种(其他)方法,请参阅此帖子。


在单行中

perl -ne'print if not /utcs*$/' file  > new_file

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

我们需要通过 shell 传递给grep特定的序列,这些序列将由 Perl 和 shell 解释或同时解释;因此它们需要正确转义。

system("grep -v 'utc\s*$' $old_file > $new_file");

这适用于我的系统。

最新更新