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

标签 regex linux bash shell grep

我试图根据存储在 bash 脚本变量中的模式从文件中 grep 出一些行,该变量可能包含 (, ), []。我使用不包含特殊字符但使用 () 的模式获得所需的输出,我得到空白输出并使用 [],我收到以下错误: 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,还有什么我可以使用的吗?

最佳答案

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

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

关于regex - grepping shell脚本中包含特殊字符的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33261427/

相关文章:

python - 在 Python 中复制和移动文件?

c - 有没有办法在不先读取磁盘扇区的情况下将几个字节写入磁盘扇区?

c - 如何在 C 中列出进程的所有文件描述符,而无需调用 lsof 或解析/proc/$PID

linux - 在 UNIX 时间戳 Shell/Bash 中使用时区转换日期

regex - 在前两个冒号上拆分字符串

regex - 如何在 OS X 上使用 sed 提取子字符串?

linux - 在 sed 指令中添加许多引用

arrays - 在 Bash 中将命令行参数转换为数组

ruby - 在测试 HTML 属性是否包含预期 URL 时,如何忽略主机名?

java - java split() 的问题