我试图用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$)//'
有人能指出我在哪里做错了吗?
答案 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