使用 sed 在捕获组内替换
Posted
技术标签:
【中文标题】使用 sed 在捕获组内替换【英文标题】:Replace within capture group using sed 【发布时间】:2018-07-23 02:21:10 【问题描述】:我正在尝试在一些包含短语分隔符的文本中使用 word2vec,例如
I <phrase>like green beans</phrase> in my tortillas.
在将文本输入 word2vec 之前,我需要输入:
I __like_green_beans__ in my tortillas.
我一直在尝试使用 sed 进行替换。通过做
sed -e 's@<phrase>\(.*\)</phrase>@__\1__@g' myfile.txt
我可以去掉分隔符,但我还没有找到替换捕获组中空格的方法。
如果可以使用 sed 有什么想法吗?
【问题讨论】:
这可能有用:Replace multiple occurrences between two strings. 感谢@PesaThe,我能够使用其中描述的 perl 方式获得我想要的结果。 【参考方案1】:你可以试试这个 sed
sed -E ':A;s/(>[^ ]*) ([^<]*<)/\1_\2/;tA;s/<[/]*phrase>/__/g'
【讨论】:
不确定在我的整个文本语料库中运行它时会如何扩展,但它可以完成工作。谢谢:) 作为参考,这个用法依赖于 GNU sed。对于 sed 的其他变体(尤其是 BSD、macOS 中的变体),您可能需要将其分成多个脚本段,如下所示:sed -E -e ':A' -e 's/(>[^ ]*) ([^<]*<)/\1_\2/;tA' -e 's/<[/]*phrase>/__/g'
【参考方案2】:
使用gnu-awk
:
awk -v ORS= -v RS='<phrase>.*</phrase>' '1;
RTgsub(/<\/?phrase>/, "___", RT); gsub(/ /, "_", RT); print RT' file
I ___like_green_beans___ in my tortillas.
【讨论】:
以上是关于使用 sed 在捕获组内替换的主要内容,如果未能解决你的问题,请参考以下文章