用正则表达式sed

时间:2014-05-08 19:38:21

标签: regex sed

我试图用sed替换序列末尾的三个字母代码(基本上删除),但是对于多个正则表达式模式效果不佳。这是一个序列的例子

GCAAAAAGTTGTATAGTCACACAACCTAGACTTATATCGTCTGCTATTCATTAG
GCAAAAAGTTGTATAGTCACACAACCTAGACTTATATCGTCTGCTATTCATTAA
GCAAAAAGTTGTATAGTCACACAACCTAGACTTATATCGTCTGCTATTCATTGA

当我尝试regex单独使用sed时,它可以正常工作

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

但是,当我尝试包含多个正则表达式时,它无法正常工作

echo "GCAAAAAGTTGTATAGTCACACAACCTAGACTTATATCGTCTGCTATTCATTAG" |
sed 's/(TAG$|TAA$|TGA$)//'

有人能指出我在哪里做错了吗?

6 个答案:

答案 0 :(得分:2)

您需要在sed:

中使用扩展的正则表达式开关
sed -r 's/(TAG|TAA|TGA)$//'

OSX上的OR:

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

或者这个没有扩展正则表达式的sed(虽然在OSX上不起作用):

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

答案 1 :(得分:2)

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

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

或者您可以使用便携式选项-E来防止转义。 -E启用扩展正则表达式,因此您的原始命令将运行而不会出现任何问题。

答案 2 :(得分:1)

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

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

sed的最新版本也支持-r选项以使用扩展正则表达式:

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

答案 3 :(得分:1)

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

sed 's/...$//'

答案 4 :(得分:1)

如果您想尝试其他解决方案,也可以使用

awk

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

答案 5 :(得分:1)

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

如果没有发生TGG或可能包含TGG

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

如果不是

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