2014-05-08 286 views
2

我试图用sed代替序列末尾的三个字母代码(基本上除去),但对于多个正则表达式模式不适用。这里是sed正则表达式

GCAAAAAGTTGTATAGTCACACAACCTAGACTTATATCGTCTGCTATTCATTAG 
GCAAAAAGTTGTATAGTCACACAACCTAGACTTATATCGTCTGCTATTCATTAA 
GCAAAAAGTTGTATAGTCACACAACCTAGACTTATATCGTCTGCTATTCATTGA 

当我尝试单独使用regexsed它的工作原理

echo "GCAAAAAGTTGTATAGTCACACAACCTAGACTTATATCGTCTGCTATTCATTAG" | sed 's/TAG$//' 
echo "GCAAAAAGTTGTATAGTCACACAACCTAGACTTATATCGTCTGCTATTCATTAA" | sed 's/TAA$//' 
echo "GCAAAAAGTTGTATAGTCACACAACCTAGACTTATATCGTCTGCTATTCATTAG" | sed 's/TAG$//' 

然而,当我尝试包括多个正则表达式不起作用

echo "GCAAAAAGTTGTATAGTCACACAACCTAGACTTATATCGTCTGCTATTCATTAG" | 
sed 's/(TAG$|TAA$|TGA$)//' 
序列的例子

难道有人指我在哪里做错了吗?

回答

2

您需要在sed使用正则表达式扩展开关:

sed -r 's/(TAG|TAA|TGA)$//' 

或OSX:

sed -E 's/(TAG|TAA|TGA)$//' 

还是这个sed的扩展没有正则表达式(不能在OSX工作,虽然):

sed 's/\(TAG\|TAA\|TGA\)$//' 
+1

很高兴知道不同平台上的不同选项....感谢您的帮助... – upendra

+0

不客气@upendra,希望它可以帮助你。 – anubhava

2

您需要转义RE元字符|和parens。

sed 's/\(TAG$\|TAA$\|TGA$\)//' 

或者您可以使用便携式选项-E来防止转义。 -E启用扩展的正则表达式,所以你的原始命令将运行没有任何问题。

+1

谢谢@anubhava。我不知道。在工作中没有mac方便,但它确实看起来很奇怪。自从我安装了gnu-sed以来,我几乎没有使用过'bsd'变种。 GNU善良已经使我瘫痪。 ':)' –

+0

我知道这些GNU版本会让我们很快忘掉旧的BSD :) – anubhava

+0

谢谢jaypal ... – upendra

1

默认情况下,sed使用基本正则表达式,这需要转义括号和管道:

sed 's/\(TAG\|TAA\|TGA\)$//' 

最近的sed版本还支持-r选项,使用扩展正则表达式:

sed -r 's/(TAG|TAA|TGA)$//' 
+0

谢谢....下一次要记住'sed'中的特殊字符。 – upendra

+0

不是所有的特殊字符,只是来自扩展RE的特殊字符。你不会逃避''','*','''例如。 – Barmar

+0

Ok.got it @Barmar。 – upendra

1

我不要认为这会对你有帮助,但是如果你想删除最后3个字符:

sed 's/...$//' 
+0

可能不是在这种情况下,因为我上面的正则表达式是用于去除序列中的三个终止密码子(通常在序列的末尾)。但很高兴知道这个以及... – upendra

1

awk也可以,如果你想尝试一些其他的解决方案中使用:

awk '{sub(/(TAG|TAA|TGA)$/,"")}1' file 
1

非GNU的sed(或--posix选项)其中|不可

如果TGG不存在的或可列入

sed 's/T[AG][AG]$//' YourFile 

如果不是

sed 's/T[AG]A$//;s/TAA$//' YourFile