首页 > 解决方案 > 在命令行上将文本文件传递给 Perl 脚本

问题描述

几年前,我编写了一个简单的脚本来从一个简单的文本文件中删除一些错误数据。最近我开始在数据中看到它,但不知道为什么。Perl 脚本 5 年没有改变,数据输入看起来和我一模一样。

我尝试从命令行进行测试,但它似乎没有像以前那样替换/删除行。我认为这可能是一个 CRLF 问题,但似乎也并非如此。

脚本很简单:

#!/usr/bin/perl -p

$_ = '' if 

# Any number of zeros 
/^[0]*\r$/ || 
# Three digits
/^\d{3}\r$/ ||
# Four digits 
/^\d{4}\r$/ ||
# Five digits 
/^\d{5}\r$/ ||
# Six digits 
/^\d{6}\r$/;

如果我从命令行调用它,

perl -e filter.pl input_file.txt

我得到了准确的输入文件,没有替换。唯一不同的是 perl 脚本在更大的 bash 脚本中运行。

我在哪里偏离轨道?

标签: regexperl

解决方案


您需要以下内容:

./filter.pl input_file.txt

shebang 行将使上述内容等同于以下内容:

/usr/bin/perl -p ./filter.pl input_file.txt

-e用于将代码作为参数传递,而不是将路径传递给脚本,因此不应在此处使用。


注意

$_ = '' if /^[0]*\r$/ || /^\d{3}\r$/ || /^\d{4}\r$/ || /^\d{5}\r$/ || /^\d{6}\r$/;

简化为

$_ = '' if /^(?:0*|\d{3,6})\r$/;

请注意,该脚本仅适用于带有 Windows 行结尾的输入文件的非 Windows 版本的 Perl。奇怪的。你确定你想要那些\r吗?


推荐阅读