查找和替换文件中的文本
Finding and replacing text within a file
我有一个大型分类文件需要编辑。该文件存在问题,因为 "Candida" 被列为 Candida 和 [Candida]。我想要做的是在文件中将 [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] 的每个实例。对我做错了什么有什么想法吗?
[] 是正则表达式中的特殊字符,所以你应该像这样转义它们:
's/\[Candida\]/Candida/g'
方括号由正则表达式解析器特殊处理,匹配其中列出的每个字符。因此,[Candida]
匹配其中的任何字符(C
、a
、n
...)。这就是你得到很多替代品的原因。
您需要通过使用反斜杠转义它们来告诉那些实用程序您需要文字括号,例如使用 sed:
sed -i 's/\[Candida\]/Candida/g' Full_HMS_Taxonomy.txt
我有一个大型分类文件需要编辑。该文件存在问题,因为 "Candida" 被列为 Candida 和 [Candida]。我想要做的是在文件中将 [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] 的每个实例。对我做错了什么有什么想法吗?
[] 是正则表达式中的特殊字符,所以你应该像这样转义它们:
's/\[Candida\]/Candida/g'
方括号由正则表达式解析器特殊处理,匹配其中列出的每个字符。因此,[Candida]
匹配其中的任何字符(C
、a
、n
...)。这就是你得到很多替代品的原因。
您需要通过使用反斜杠转义它们来告诉那些实用程序您需要文字括号,例如使用 sed:
sed -i 's/\[Candida\]/Candida/g' Full_HMS_Taxonomy.txt