awk的gsub函数使用正则.*匹配字符串模式并替换的相关疑问
解答
.* 表示匹配任意长度任意字符的写法,可以在awk的gsub操作中正常使用,和你在R语言里的使用逻辑一致,但你现有代码存在三处可优化/修正的点:
- 正则规则冗余错误:你写的
/\Class=中C不属于正则特殊字符,不需要加反斜杠转义,直接写/Class=即可 - 贪婪匹配风险:
.*默认是贪婪匹配规则,如果你处理的字符串中存在多个;id=片段,会直接匹配到最后一处;id=的位置,不符合你的需求。如果要严格匹配你指定的Class=xxx;Family=xxx;id=片段,更稳妥的写法是将.*替换为[^;]*;Family=[^;]*,避免匹配越界 - 语法错误:你当前写的
gsub语法多了一个多余的右括号,正确的gsub语法为gsub(匹配正则, 替换内容, 目标字段),三个参数需要放在同一对括号内
修正后可用命令
如果你要处理的目标内容是行内第4个制表符分隔字段,可用以下命令:
awk 'BEGIN{FS=OFS="\t"} {gsub(/Class=(.*);id=/, "ID=", $4)} 1'
更稳妥的非贪婪等价写法
避免贪婪匹配导致的匹配范围过大问题:
awk 'BEGIN{FS=OFS="\t"} {gsub(/Class=[^;]*;Family=[^;]*;id=/, "ID=", $4)} 1'
将你提供的待处理字符串输入上述命令后,输出结果为:
ID=TFCP2.Ca9750.2.YY2017.HT-SE2;strand=+;seq=TTCTGGTTGGGACCAGGA;score=7.62921;pval=6.53e-05;Averageconservationscore=1.77
完全符合你的替换需求。
内容的提问来源于stack exchange,提问作者Myke
相关产品推荐
相关产品推荐

