在文件中查找和替换文本
Posted
技术标签:
【中文标题】在文件中查找和替换文本【英文标题】:Finding and replacing text within a file 【发布时间】:2020-07-29 03:30:16 【问题描述】:我有一个需要编辑的大型分类文件。文件存在问题,因为“念珠菌”同时列为 念珠菌 和 [念珠菌]。我想要做的是将文件中的每个 [Candida] 案例更改为 Candida。
我尝试了几种方法,但从未得到我想要的输出。这是分类文件的前几行:
Penicillium;marneffei;NW_002197112.1
Penicillium;marneffei;NW_002197111.1
Penicillium;marneffei;NW_002197110.1
Penicillium;marneffei;NW_002197109.1
Penicillium;marneffei;NW_002197108.1
使用 sed 给我这个输出:
$ sed -i -e 's/[Candida]/Candida/g' Full_HMS_Taxonomy.txt
PeCandidaCandidacCandidallCandidaum;mCandidarCandidaeffeCandida;NW_002197112.1
PeCandidaCandidacCandidallCandidaum;mCandidarCandidaeffeCandida;NW_002197111.1
PeCandidaCandidacCandidallCandidaum;mCandidarCandidaeffeCandida;NW_002197110.1
PeCandidaCandidacCandidallCandidaum;mCandidarCandidaeffeCandida;NW_002197109.1
PeCandidaCandidacCandidallCandidaum;mCandidarCandidaeffeCandida;NW_002197108.1
使用 awk 给我这个输出:
$ awk 'gsub(/[Candida]/,"Candida")1' Full_HMS_Taxonomy.txt
PeCandidaCandidacCandidallCandidaum;mCandidarCandidaeffeCandida;NW_002197112.1
PeCandidaCandidacCandidallCandidaum;mCandidarCandidaeffeCandida;NW_002197111.1
PeCandidaCandidacCandidallCandidaum;mCandidarCandidaeffeCandida;NW_002197110.1
PeCandidaCandidacCandidallCandidaum;mCandidarCandidaeffeCandida;NW_002197109.1
PeCandidaCandidacCandidallCandidaum;mCandidarCandidaeffeCandida;NW_002197108.1
在这两种情况下,它都将 Candida 添加到多个位置和多行,而不是仅替换 [Candida] 的每个实例。关于我做错了什么有什么想法吗?
【问题讨论】:
【参考方案1】:[] 是正则表达式中的特殊字符,所以你应该像这样转义它们:
's/\[Candida\]/Candida/g'
【讨论】:
【参考方案2】:正则表达式解析器对括号进行特殊处理,匹配其中列出的每个字符。因此,[Candida]
匹配其中的任何字符(C
、a
、n
...)。这就是为什么你会得到很多替换。
你需要告诉那些实用程序你想要文字括号,方法是用反斜杠转义它们,例如使用 sed:
sed -i 's/\[Candida\]/Candida/g' Full_HMS_Taxonomy.txt
【讨论】:
以上是关于在文件中查找和替换文本的主要内容,如果未能解决你的问题,请参考以下文章