我每天都会创建一个文件,我想删除结束字符是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");
这适用于我的系统。