如何在其中使用具有特殊字符'$'的单词?

时间:2013-07-25 05:49:59

标签: shell grep

我有2个o / p文件,我比较找到类似的单词。这是脚本的一部分..

Bool=`grep "^$i" File1`
if [ -z "$Bool" ]
then
    echo " $i Not Available"
fi

我在两个文件中都有一个单词“profile $”,但我得到一个输出“Not Available”。 我试过单引号但是两个文件中相似的所有单词都不可用。

文件1输出

Shared_Docs
tools
tachqe8_rvl
profile$

文件2输出

tools
tachqe8_rvl
profile$

这里我的$i从File2读取每一行并执行grep以查看它是否在File1中。 如果不匹配则回显$i不可用。

理想情况下,我的回声应该是:

Shared_Docs

但是我得到了

Shared_Docs
profile$

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

变量$i是否包含值profile$?我会假设它确实如此。

这个词结尾的一美元很棘手。没有变量,你可以写:

 Bool=$(grep '^profile\$' File1)

使用变量,我们需要一个技巧来抑制$作为元字符的含义:

Bool=$(grep "^$i.*" File1)

(请注意,使用$(...)比使用反向标记(即后引号)的等效文件要好得多。)

当然,如果你想让整行完全profile,那么就不需要特殊的技巧了:

Bool=$(grep "^$i" File1)

应该可以正常工作。


处理问题中的生物问题

while read -r i
do
    Bool=$(grep "^$i.*" File1)
    if [ -z "$Bool" ]
    then
        echo " $i Not Available"
    fi
done < File2

-r会抑制您可能遭受的一些扩展。如果你的shell不喜欢它,请放弃它;没有它你通常会没事。


另一种方法

如果您要查找缺失的行并且订单不重要,那么您可以对File1File2进行排序,然后使用comm对它们进行比较,获取所有条目File2但不在File1。如果您有bash和'进程替换',那么:

comm -13 <(sort File1) <(sort File2)

如果您没有进程替换,那么:

sort -o File1 File1
sort -o File2 File2
comm -13 File1 File2

答案 1 :(得分:0)

问题出现是因为“$”结尾处的“$”。 “$”是行尾锚点,但只有当它出现在RE的末尾时才具有这种特殊含义。在RE结束时添加无害的东西。例如,尝试

grep -i“^ $ i。*”File1