我正在尝试隐藏此输入文件的内容:
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
如何在不编写另一个正则表达式的情况下停止出现在“:”之后出现的额外逗号(我想要“:”和单个空格)?
谢谢
答案 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+$//
修剪它,不要忘记在那之后添加换行符。