【问题标题】:grepping variables containing special characters in a shell script在 shell 脚本中对包含特殊字符的变量进行 grepping
【发布时间】:2015-10-21 14:01:46
【问题描述】:

我正在尝试根据存储在 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 的吗?

【问题讨论】:

  • 也许用反斜杠转义字符?
  • 谢谢,已经添加了样本..希望我的问题很清楚..
  • 哦,我已经尝试过了,但是如果我的模式是“14-3-3-like protein”,那么包含该模式的所有行都会被 grepped,其中还包括“14-3-3”这样的模式-like protein B" 尽管有 -F 选项..所以我的解决方法是使用制表符作为模式边界..
  • 可以使用:grep -F $'\t'"$line"$'\t' "$2"
  • 是的,这很好用。谢谢。

标签: regex linux bash shell grep


【解决方案1】:
tab=$(echo -e \\t)
grep -F "$tab$line$tab" $2

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

【讨论】:

  • @MeetaSunil 如果您对答案没问题,您应该接受该解决方案并投票赞成。它会奖励您一个徽章,其他查找您的问题的用户可以看到它已解决。
猜你喜欢
  • 2021-01-11
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
相关资源
最近更新 更多