regex - 在命令行上将文本文件传递给 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 脚本中运行。
我在哪里偏离轨道?
解决方案
您需要以下内容:
./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
吗?
推荐阅读
- ios - 在不更改 BundleId 的情况下辞职 iOS 应用程序 .iPA 文件
- svg - 自定义标记的 SVG 折线
- javascript - 如何从 VueJs 中的 body 获取参数值?
- sql - 将两个不同查询的结果相加
- html - sqPaymentForm 不适用于 IOS 自动填充
- codenameone - 应用停止/恢复后将代号一组件保持在无效位置
- .net - .Net WebApi - CustomValidation 方法调用两次
- c++ - 使用 CURL 上传构建
- git - 我可以从组织中的其他存储库全局访问 Git LFS 文件吗?
- javascript - Javascript如何将字符串转换为uint64类型