【发布时间】: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