Как заменить определенные символы с помощью табуляции с помощью sed - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть файл, который содержит следующий текст:

chr9    116186254   116186404   chr9:116163625-116163775,1  2936    .
chrM    5   155 chrM:16377-16527,1  253 .

Что я хочу сделать, это удалить не алфавитно-цифровой (т.е. : , -) символ с помощью табуляции.

Я пробовал это:

cat test.txt | sed 's/[:-\,\-]/  /g'

Но это даст мне это:

chr9    116186254   116186404   chr9  116163625  116163775  1   2936    .
chr     5   155 chr    16377  16527  1  253 .

Обратите внимание, что chrM полностью изменено на chr. Как правильно это сделать?

Желаемый результат:

chr9    116186254   116186404   chr9  116163625  116163775  1   2936    .
chrM    5   155 chrM    16377  16527  1 253 .

1 Ответ

0 голосов
/ 05 ноября 2018

Вы можете заменить любую пунктуацию на символ табуляции, используя

sed 's/[[:punct:]]/\t/g' test.txt > test.out.txt

Или любой знак препинания с одной вкладкой:

sed -E 's/[[:punct:]]+/\t/g' test.txt > test.out.txt
sed 's/[[:punct:]][[:punct:]]*/\t/g' test.txt > test.out.txt

См. онлайн sed демо .

В этих двух последних примерах -E позволяет синтаксису POSIX ERE использовать неэкранированный + в качестве квантификатора, который соответствует 1 или более экземплярам квантифицированного подшаблона. Вариант BRE POSIX требует [[:punct:]][[:punct:]]*, где [[:punct:]]* соответствует 0 или более знаков препинания. Обратите внимание, что в GNU sed этот шаблон BRE POSIX может быть записан как [[:punct:]]\+ (где \+ совпадает с + в шаблоне POSIX ERE, квантификатор).

...