grepping包含shell脚本中特殊字符的变量

时间:2015-10-21 14:01:47

标签: regex linux bash shell grep

我正在尝试根据存储在bash脚本中的变量中的模式从文件中插出一些行,这些变量可能包含()[] 。我得到了所需的输出,其中包含不包含特殊字符的模式但使用(),我得到一个空白输出,并使用[],我得到了以下错误: grep:字符类中的范围无序

模式文件示例:

14-3-3-like protein B
14-3-3-like protein B (Fragment)
3-oxoacyl-[acyl-carrier-protein] synthase 2

输入文件示例:

seq1    gi|703124372    380    285    +    2e-154    14-3-3-like protein B    sp
seq2    Q96451    69    51    +    3e-16    14-3-3-like protein B (Fragment)    sp
seq3    P0AAI5    104    84    -    4e-20    3-oxoacyl-[acyl-carrier-protein] synthase 2    sp

我的代码如下:

if [ $@==0 ]
    then echo -e "\nUSAGE: $0 [pattern file] [in file] > [out file]\n"
    exit;
else
    while read line; do
            echo -e "Pattern: $line"
            grep -P "\t$line\t" $2
            echo -e "\n"
    done < $1

输出样本:

Pattern: 14-3-3-like protein B 
seq1    gi|703124372    380    285    +    2e-154    14-3-3-like protein B    sp
Pattern: 14-3-3-like protein B (Fragment)    sp
Pattern: 3-oxoacyl-[acyl-carrier-protein] synthase 2
grep: range out of order in character class

我尝试过使用grep -Fw但是也没有提供所需的输出。 我还尝试使用\(\[而不是([替换两个输入文件中的模式,但这也不起作用。

我知道如何实现这一目标?还有什么我可以用而不是grep吗?

1 个答案:

答案 0 :(得分:0)

tab=$(echo -e \\t)
grep -F "$tab$line$tab" $2

编辑: 另见@anubhava的建议:grep -F $'\t'"$line"$'\t' "$2"