我正在尝试使用 perl 在 csv 文件中搜索文本。但我需要完全匹配,让我们看看我是否正在搜索一个我不想让脚本在结果中显示 US 的单词。我曾尝试在开头和结尾使用“” & /b,如果我将值从 CSV 存储到数组,它可以工作,但如果我想直接在 CSV 中搜索,它不起作用。我的 $curr = U if(grep $curr, "test.csv") print "Done"
这向我展示了美国作为输出
首先,让我纠正你的一个误解。这个:
grep "U", "test.csv"
...不是stringgrep
的文件,它为计算结果为 true的项目的字符串列表进行 greps (这是所有项目,始终为 true)。在 Perl 中,应用于参数列表,如下所示:test.csv
U
test.csv
"U"
"U"
grep
grep /foo/, @list;
但是,您不需要这样做grep
。使用它意味着将整个文件读入内存来为grep
.
我假设您在这里寻找的是一种简单的方法来检查 csv 文件中的确切字符串。一种简单的方法是使用否定的环视断言:
my $del = ","; # your csv delimiter
my $search = "U"; # the text you search for
while (<>) {
print if /(?<![^$del])$search(?![^$del])/;
}
(?<![^$del])
断言字符串之前的字符不是非分隔符,同样断言(?![^$del])
后面的字符不是非分隔符。双重否定可能看起来很复杂,但好处是它们还匹配搜索字符串没有被两边的分隔符包围的条件,即 csv 行的开头或结尾。
此处的菱形运算符将打开作为脚本参数提供的文件,并在 while 循环的每次迭代中通读其内容。例如:
perl mygrep.pl test.csv
这不是一个完整的解决方案,但它应该让您知道如何到达目的地。
perl -lne 'print if(/\bU\b/)'' your_csv_file
测试如下:
> cat temp
info info US info cat
info info U info cow
info info info dog
info info U info dinosaur
info info info bat
phoenix.209> perl -lne 'print if(/\bU\b/)' temp
info info U info cow
info info U info dinosaur
或者您也可以在命令行上使用 grep,如下所示
> grep -w U temp
info info U info cow
info info U info dinosaur