【问题标题】:Replace within capture group using sed使用 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 有什么想法吗?

【问题讨论】:

标签: bash awk sed replace


【解决方案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;
RT{gsub(/<\/?phrase>/, "___", RT); gsub(/ /, "_", RT); print RT}' file

I ___like_green_beans___ in my tortillas.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2018-04-27
    • 2019-10-16
    • 1970-01-01
    • 2017-12-05
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多