使用 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/(&gt;[^ ]*) ([^&lt;]*&lt;)/\1_\2/;tA' -e 's/&lt;[/]*phrase&gt;/__/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 在捕获组内替换的主要内容,如果未能解决你的问题,请参考以下文章

sed 怎样在文本里指定位置插入字符

sed / awk 匹配文件中第二次出现的正则表达式,并替换整行

sed多行模板替换

使用 sed 命令替换

如何在sed中使用变量

sed在替换的时候,使用变量中的值?如何在sed实现变量的替换?获取到变量中的值?