如何使用sed在捕获组内进行替换?
用sed处理word2vec语料:替换短语分隔符内的空格
当然能用sed搞定!我之前处理word2vec的语料时也遇到过类似需求,核心是先把短语分隔符内部的空格替换成下划线,再去掉分隔符,用sed的循环替换就能实现。
核心思路
sed本身支持循环匹配替换,我们可以先定位到短语分隔符包裹的内容范围,反复替换范围内的空格,直到该短语内没有空格为止,最后再移除分隔符。
具体实现(以{}作为短语分隔符为例)
假设你的输入文本是这样的:
I want to train word2vec on {machine learning} and {natural language processing}
执行这条sed命令就能完成需求:
sed ':a s/\({[^}]*\) /\1_/; ta; s/[{}]//g' your_corpus.txt
命令拆解
:a:定义一个名为a的循环标签,用于后续重复执行替换操作s/\({[^}]*\) /\1_/:匹配{开头、后续是任意非}字符(也就是短语内部内容)、最后跟着一个空格的片段,把空格替换成下划线ta:如果上一步的替换操作成功执行了,就跳回到标签a继续循环,直到当前短语内的所有空格都被替换完s/[{}]//g:最后全局移除所有的{和}分隔符
执行后输出的文本就是符合word2vec要求的格式:
I want to train word2vec on machine_learning and natural_language_processing
适配其他分隔符
如果你的短语用的是其他分隔符(比如[]、""),只需要修改正则里的分隔符即可:
- 用
[]作为分隔符:sed ':a s/\(\[[^]]*\) /\1_/; ta; s/[][]//g' your_corpus.txt - 用双引号
""作为分隔符:sed ':a s/\("[^"]*\) /\1_/; ta; s/"//g' your_corpus.txt
注意事项
这个方法适用于非嵌套的短语分隔符,如果你的文本里有嵌套的分隔符(比如{this {is a} test}),sed的正则处理起来会比较麻烦,这种情况可能需要用更强大的工具(比如awk或Python),但绝大多数word2vec语料的短语分隔都是非嵌套的,这个sed方案完全够用。
内容的提问来源于stack exchange,提问作者nbermudezs
相关产品推荐
相关产品推荐

