在perl中使用grep中的excel中的确切单词匹配

时间:2013-01-25 11:51:57

标签: perl unix

我正在尝试使用perl在csv文件中搜索文本。但我需要完全匹配,让我们看看我是否正在搜索一个单词我不希望脚本在结果中显示美国。我试过用“”& / b在开头和结尾,如果我将值从CSV存储到数组,但是如果我想直接在CSv中搜索它不起作用。 我的$ curr = U. if(grep $ curr,“test.csv”) 打印“完成”

这显示我是美国的输出

2 个答案:

答案 0 :(得分:4)

首先,让我纠正你的误解。这样:

grep "U", "test.csv"
对于字符串grep

...不test.csv文件U,它会对test.csv计算到的项目的字符串列表"U"进行查询true(所有这些都是"U"总是如此)。在Perl中,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循环的每次迭代中读取其内容。 E.g:

perl mygrep.pl test.csv

这不是一个完整的解决方案,但它应该让你知道如何到达目的地。

答案 1 :(得分:0)

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