gpt4 book ai didi

Bash 在命令行上工作,但不在 perl 脚本中工作

转载 作者:行者123 更新时间:2023-11-29 09:21:26 25 4
gpt4 key购买 nike

我有一组要清理的 .csv 文件。每个都有这样的数据:

x0,"","",""
x1,123,456,789
x2,123,456,789
x3,123,456,789
-,"","",""
x4,123,456,789
[space],____,____,____
x5,123,456,789
x6,===,====,======
x7,---,--------=--,-------

我想删除所有不是 xn,###,###,### 的行,所以在这个例子中,它是第 1、5、7、9 和 10 行。在 cygwin 命令中行,我逐一键入以下命令:

    sed -i '/"",""/d' *.csv
sed -i '/___/d' *.csv
sed -i '/---/d' *.csv
sed -i '/===/d' *.csv

这些都有效。但是,当我尝试将它们放在一起放入 perl 脚本时(我的其余代码在 perl 中,它们失败了:

    system("sed -i '/"",""/d' *.csv");
system("sed -i '/___/d' *.csv");
system("sed -i '/---/d' *.csv");
system("sed -i '/===/d' *.csv");

我得到了结果:

String found where operator expected at test1.pl line 1, near ""sed -i '/"",""

(Missing operator before ","?)

String found where operator expected at test1.pl line 1, near "",""/d' *.csv""

(Missing operator before "/d' *.csv"?)

syntax error at test1.pl line 1, near ""sed -i '/"",""

我注意到除了第一个命令之外的所有工作 -- sed 中的 "" 有什么特别之处吗?任何帮助,将不胜感激!也欢迎使用更简单的解决方案!

最佳答案

如果您的脚本的其余部分是用 Perl 编写的,我强烈建议您将对 sed 的调用替换为 native 实现。

例如,您使用 sed 所做的替换可以替换为如下内容:

use strict;
use warnings;

for my $file (glob '*.csv') {
open my $in, '<', $file;
my @lines;
while (<$in>) {
next if /"",""/;
next if /___/;
next if /---/;
next if /===/;
push @lines, $_;
}
close $in;

# this will overwrite your files!
# change $file to something else to test
open my $out, '>', $file;
print $out $_ for @lines;
}

这遍历以 .csv 结尾的每个文件,读取每一行。它会跳过与其中一种模式匹配的任何行(如果需要,您可以在每个模式之间使用带有 | 的单个正则表达式来执行此操作,但我将其保留为与您对 sed 的调用相同)。它将所有剩余的行推送到一个数组。然后它重新打开输入文件进行写入并打印数组。

诚然,就行数而言,它稍微长了一点,但是当 Perl 功能强大时,它使您不必使用 system 来调用外部命令。这也意味着每个文件只打开一次,而不是像在原始代码中那样每次替换打开一次。

关于Bash 在命令行上工作,但不在 perl 脚本中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32364047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com