Поиск и замена текста в файле - PullRequest
1 голос
/ 16 апреля 2020

У меня есть большой файл таксономии, который мне нужно отредактировать. Существует проблема с файлом, поскольку "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]. Есть идеи, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Скобки обрабатываются особым образом синтаксическими анализаторами регулярных выражений, соответствующими каждому символу, указанному внутри них. Итак, [Candida] соответствует любому из символов внутри него (C, a, n ...). Вот почему вы получаете много замен.

Вы должны указать тем утилитам, что вы хотите буквальные скобки, экранируя их обратной косой чертой, например, с помощью sed:

sed -i 's/\[Candida\]/Candida/g' Full_HMS_Taxonomy.txt
1 голос
/ 16 апреля 2020

[] - это специальные символы в регулярном выражении, поэтому вы должны избегать их следующим образом:

's/\[Candida\]/Candida/g'
...