【发布时间】:2019-10-22 04:57:59
【问题描述】:
我想知道你能不能告诉我在一个包含字符 A、C、G、T 并且长度是 3 的倍数的 txt 文件中查找子字符串的命令是什么
我的命令是这样的
egrep "[ACGT]" dna.txt
但我仍然坚持使用 3 部分的倍数。我想我将不得不使用{},但我不知道如何。
【问题讨论】:
-
如果一行包含字符串 TACA(长度为 4)应该输出什么?
我想知道你能不能告诉我在一个包含字符 A、C、G、T 并且长度是 3 的倍数的 txt 文件中查找子字符串的命令是什么
我的命令是这样的
egrep "[ACGT]" dna.txt
但我仍然坚持使用 3 部分的倍数。我想我将不得不使用{},但我不知道如何。
【问题讨论】:
为了重新表述您的要求,您需要一个或多个重复的三个匹配序列。
grep -E -x '([ACGT]{3})+' dna.txt
更详细地说,括号用于分组,因此最后的+(一个或多个)适用于整个组;在组内,简单的表达式[ACGT]{3} 匹配三个相邻的字符,每个字符都可以是字符类枚举中的任意一个。
grep 默认打印出任何包含匹配的子字符串的行; -x 要求整行匹配。
grep -E 的同义词 egrep 已过时,今后应该避免使用。
【讨论】:
egrep 是一个遗留术语,它将继续有效,但不应该教给初学者。也许提示您的教授查看 POSIX 规范。另见unix.stackexchange.com/questions/17949/…
请注意,普通的旧 grep 可以做到这一点,尽管更冗长:
grep -o '[ACGT][ACGT][ACGT]' <<< TACA
输出:
TAC
【讨论】:
bash手册的DNA:man bash | tr '[a-z]' '[A-Z]' | grep -o '[ACGT][ACGT][ACGT]' | xargs echo
grep BRE 语法支持 \([ACGT]\{3\}\)\+,它古怪且不优雅,但可以合理地移植到当前的千禧年。
tr 的参数中的方括号并没有错(因为您将[ 转换为[ 和] 转换为]),但完全是多余的
grep '^[ACGT][ACGT][ACGT]$' 。
grep -x,如我的回答。