file(1) 和 magic(5) :对结果进行优先级排序

Pie*_*rre 7 file-command regular-expression

我的问题如下:file(1) 和 magic(5) :描述其他格式

我想描述一个 FASTA 序列(http://en.wikipedia.org/wiki/FASTA_format

它可能是一个DNA 序列(只有 ATGC)

>header
ATGCTAGCATAGCATCGATGCTGTAGCTACGTAGCTACGTCTACG
Run Code Online (Sandbox Code Playgroud)

一个“神奇”的模式将是

>.*\n[ATGC]*
Run Code Online (Sandbox Code Playgroud)

蛋白质序列(也包含 ATGC 的 ACDEFGHIKLMNPQRSTVWYBZX)

>header
AHITKLMNPQRGHIKLMNPQRC
Run Code Online (Sandbox Code Playgroud)

一个“神奇”的模式将是

>.*\n[ACDEFGHIKLMNPQRSTVWYBZX]*
Run Code Online (Sandbox Code Playgroud)

但是每当我使用这些正则表达式时,文件都会告诉我它是一种蛋白质,因为它与第二个正则表达式匹配。有没有办法对结果进行优先排序?有没有办法优先考虑,比如“如果匹配,不要尝试任何其他模式?”。

Jig*_*aga 2

您可以使用“强度”值设置优先级。来自魔法(5)

可以在单独的行上提供可选的强度,它使用以下格式引用当前的魔法描述:

    !:strength OP VALUE
Run Code Online (Sandbox Code Playgroud)

操作数 OP 可以是:+、-、* 或 /,VALUE 是 0 到 255 之间的常量。使用指定的操作数将该常量应用于当前计算的默认魔法强度。

要降低蛋白质描述的优先级,请附加以下行:

!:strength - N
Run Code Online (Sandbox Code Playgroud)

...哪里N足够大以使其低于 DNA 描述的分数。

测试的“当前计算的默认魔法强度”并不是立即显而易见的,但您可以使用该--list标志来显示所有内容。或者,阅读源代码 - 负责的函数是apprentice_magic_strength. 它是根据条目的第一个测试计算得出的,因此如果您想让一种类型优先于另一种类型,那么具有相同的第一行会很有帮助。(这样,N只需为 1。)

另一个问题:您的正则表达式不够严格。 *可以匹配零个字符,因此可以在每行的开头找到该模式 - 蛋白质、DNA 或其他。要加强它,请确认整行包含允许的字符:\n[ATGC]+$, 或\n[ATGC]{num,}$(其中 num 是您期望看到的最短模式)

0       string  =>header
>&0      regex   \n[ATGC]+$     DNA

0       string  =>header
>&0      regex   \n[ACDEFGHIKLMNPQRSTVWYBZX]+$  PROTEIN
!:strength - 1
Run Code Online (Sandbox Code Playgroud)