循环时grep不在内部工作

时间:2014-07-22 06:00:43

标签: grep

我有两个文件

File1中


area a 
area b 
areaf

文件2


area a :aaaa
area b:bbbb
area3:abc
areaf:hsg
area4:uhg
area5:yutr

while read -r line

do 

grep -w ^line File2 | cut -d ":" -f2

done < File1

期望的输出


aaaa
bbbb
hsg

实际输出


grep: can't open a
area a
grep: cant open b

area3:abc
areaf:hsg
area4:uhg
area5:yutr

但是当我运行grep -w ^"area a" File2 | cut -d ":" -f2时,它会给出正确的输出:

aaaa

请帮助我。我也试过循环。没有成功。 grep在循环内部不起作用。

2 个答案:

答案 0 :(得分:2)

您的变量line可能包含“特殊字符”。例如,shell可能会将其解释为分隔符。或者某些可能被grep解释为模式元字符的字符。

您需要使用fgrep引用您的变量(我不确定-w为该命令添加任何内容 - 为什么您觉得需要它):

fgrep -w "$line"

但这样做会让你无法找到“第一个角色”


如果需要匹配“行首”匹配,则另一个选项是转义搜索字符串:

while read -r line
do 
    line=$(echo "$line" | sed -e 's/[]\/$*.^|[]/\\&/g')
    grep -w "^$line" File2 | cut -d ":" -f2
done < File1

答案 1 :(得分:0)

您可以在没有循环的情况下获得相同的结果,因为grep可以通过-f选项从文件中读取模式。这将更加强大:

grep -f input1 input2 | cut -d: -f2

给出:

aaaa
bbbb
hsg