我使用以下脚本搜索另一个文件中的一个文件的每一行,如果发现它打印该行的第二列:
#!/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搜索具有某些特殊字符的确切单词。
答案 0 :(得分:1)
的使用更相关
csh
和bash
是shell的完全不同的变体。他们甚至不应该兼容。您的问题与grep
由于-F
中的grep
标记允许您的字符串为固定模式,因此容易包含各种正则表达式特殊字符,例如,
,[]
,{ {1}},()
,.
,*
,^
,$
,-
错误结果是因为\
标记-F
文件中的行\$#%$%escaped.Integer%^^&[10]
与Gold
上的所有输入行匹配。
通常,搜索的确切单词可以通过单词边界构造RegFile
和^
作为模式的一部分进行过滤,但由于{{1},它不适用于您的情况标志它们将被视为搜索字符串的一部分。
因此,假设从输入文件中,
$
文件中的每一行只有一个匹配到-F, --fixed-strings
您可以停止Gold
搜索在第一次点击之后
使用RegFile
标记,根据grep
页面说明,
-m1
所以添加就像,
man grep
应该解决你的问题。