在文件中查找和替换文本

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] 匹配其中的任何字符(Can...)。这就是为什么你会得到很多替换。

你需要告诉那些实用程序你想要文字括号,方法是用反斜杠转义它们,例如使用 sed:

sed -i 's/\[Candida\]/Candida/g' Full_HMS_Taxonomy.txt

【讨论】:

以上是关于在文件中查找和替换文本的主要内容,如果未能解决你的问题,请参考以下文章

在 .sql 文件中查找和替换文本

在所有子目录中的文件中查找和替换文本[重复]

Perl:在多个文本文件中查找和替换特定字符串

查找和替换文件中的单词/行

根据文本文件的名称查找和替换文本文件中的单词

我们如何在匹配两个文本文件时查找和替换单词?