grep命令在csh中搜索文件中的确切单词时给出意外输出

时间:2017-03-01 09:56:46

标签: bash shell grep csh

我使用以下脚本搜索另一个文件中的一个文件的每一行,如果发现它打印该行的第二列:

#!/bin/csh

set goldFile=$1
set regFile=$2

set noglob
foreach line ("`cat $goldFile`")
    set searchString=`echo $line | awk '{print $1}'`
    set id=`grep -w -F "$searchString" $regFile | awk '{print $2}'`
    echo "$searchString" "and" "$id"
end

unset noglob

黄金档案如下:

\$#%$%escaped.Integer%^^&[10]
\$#%$%escaped.Integer%^^&[10][0][0][31]
\$#%$%escaped.Integer%^^&[10][0][0][30]
\$#%$%escaped.Integer%^^&[10][0][0][29]
\$#%$%escaped.Integer%^^&[10][0][0][28]
\$#%$%escaped.Integer%^^&[10][0][0][27]
\$#%$%escaped.Integer%^^&[10][0][0][26]

和RegFile如下:

\$#%$%escaped.Integer%^^&[10] 1
\$#%$%escaped.Integer%^^&[10][0][0][31] 10
\$#%$%escaped.Integer%^^&[10][0][0][30] 11
\$#%$%escaped.Integer%^^&[10][0][0][29] 12
\$#%$%escaped.Integer%^^&[10][0][0][28] 13
\$#%$%escaped.Integer%^^&[10][0][0][27] 14
\$#%$%escaped.Integer%^^&[10][0][0][26] 15

输出即将来临:

\$#%$%escaped.Integer%^^&[10] and 1 10 11 12 13 14 15
\$#%$%escaped.Integer%^^&[10][0][0][31] and 10
\$#%$%escaped.Integer%^^&[10][0][0][30] and 11
\$#%$%escaped.Integer%^^&[10][0][0][29] and 12
\$#%$%escaped.Integer%^^&[10][0][0][28] and 13
\$#%$%escaped.Integer%^^&[10][0][0][27] and 14
\$#%$%escaped.Integer%^^&[10][0][0][26] and 15

但预期的输出是:

\$#%$%escaped.Integer%^^&[10] and 1
\$#%$%escaped.Integer%^^&[10][0][0][31] and 10
\$#%$%escaped.Integer%^^&[10][0][0][30] and 11
\$#%$%escaped.Integer%^^&[10][0][0][29] and 12
\$#%$%escaped.Integer%^^&[10][0][0][28] and 13
\$#%$%escaped.Integer%^^&[10][0][0][27] and 14
\$#%$%escaped.Integer%^^&[10][0][0][26] and 15

请帮我弄清楚如何使用grep搜索具有某些特殊字符的确切单词。

1 个答案:

答案 0 :(得分:1)

  

cshbash是shell的完全不同的变体。他们甚至不应该兼容。您的问题与grep

的使用更相关

由于-F中的grep标记允许您的字符串为固定模式,因此容易包含各种正则表达式特殊字符,例如,[],{ {1}},().*^$-

错误结果是因为\标记-F文件中的行\$#%$%escaped.Integer%^^&[10]Gold上的所有输入行匹配。

通常,搜索的确切单词可以通过单词边界构造RegFile^作为模式的一部分进行过滤,但由于{{1},它不适用于您的情况标志它们将被视为搜索字符串的一部分。

  

因此,假设从输入文件中,$文件中的每一行只有一个匹配到-F, --fixed-strings您可以停止Gold搜索在第一次点击之后

使用RegFile标记,根据grep页面说明,

-m1

所以添加就像,

man grep

应该解决你的问题。