用逗号空格替换空格的正则表达式,除了行尾

时间:2016-11-02 06:28:44

标签: regex perl

我正在尝试隐藏此输入文件的内容:

NP_418770.2: 257-296 344-415 503-543 556-592 642-707
YP_026226.4: 741-779 811-890 896-979 1043-1077

到此:

NP_418770.2: 257-296, 344-415, 503-543, 556-592, 642-707
YP_026226.4: 741-779, 811-890, 896-979, 1043-1077

即,用逗号和空格替换空格(不包括换行符)

为此,我尝试过:

perl -pi.bak -e "s/[^\S\n]+/, /g" input.txt

但它给出了:

NP_418770.2:, 257-296, 344-415, 503-543, 556-592, 642-707
YP_026226.4:, 741-779, 811-890, 896-979, 1043-1077

如何在不编写另一个正则表达式的情况下停止出现在“:”之后出现的额外逗号(我想要“:”和单个空格)?

谢谢

3 个答案:

答案 0 :(得分:10)

尝试使用正则表达式负向lookbehind。基本上看一下空格前的字符是否为冒号(:),然后它与该空格不匹配。

s/(?<!:)[^\S\n]+/, /g

答案 1 :(得分:4)

您可以使用单词边界来丢弃冒号后面的空格:s/\b\h+/, /g

可以使用perl:

perl -pe's/\b\h+/, /g' file

还有sed:

sed -E 's/\b[ \t]+/, /g' file

使用字段分隔符的其他方法:

perl -F'\b\h+' -ape'BEGIN{$,=", "}' file

或者用awk做同样的事情:

awk -F'\b[ \t]+' -vOFS=', ' '1' file

答案 2 :(得分:2)

你很亲密。这应该是诀窍:

s/(\d+-\d+)[^\S\n]+/$1, /g

问题是,我试着看看会在它们之后得到一个逗号的部分,这些部分适用于&#34;数字的模式,然后是破折号,更多的数字,然后是一个不是a的空格换行符&#34 ;.关于它的有趣之处在于我说'#34;空白不是换行符&#34;部分为[^\S\n]+,表示&#34;不是非空格或换行符&#34; (因为\S并非\s,我们也希望排除换行符。如果在任何情况下你都有一些尾随空格,你可以在上面的正则表达式之前用s/\s+$//修剪它,不要忘记在那之后添加换行符。