如何使用sed用tab替换特定字符

时间:2018-11-05 08:58:55

标签: sed

我有一个包含以下文本的文件:

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 :(得分:2)

您可能希望使用来用制表符替换所有标点符号

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

请参见online sed demo

在后两个示例中,-E使POSIX ERE语法可以使用未转义的+作为与1个或多个出现的量化子模式匹配的量词。 BRE POSIX变体需要[[:punct:]][[:punct:]]*,其中[[:punct:]]*匹配0个或多个标点符号。请注意,在GNU sed中,此BRE POSIX模式可以写为[[:punct:]]\+(其中\+与POSIX ERE模式中的+相同,是一个量词)。 / p>