在一行中的两个单词之间替换RegEx模式

时间:2018-12-17 01:54:31

标签: regex unix sed

我想找到在字符串“ START:”和“ END:”之间出现一个或多个大写字母后跟冒号“:”的所有实例。然后,我想在每个实例之前添加一个句点。

  

示例输入:

     

我想测试如果标题前有信息会发生什么   我在寻找。因此,我们在这里撒谎:并结束。开始:现在我们看到了所有   我们拥有的重要信息:一堆奇怪的东西:   标头。我要突出显示所有标题:并添加句点   在他们面前将信息分为不同的句子:现在   我可以停下来,因为我打了结束头。结束:之后的更多信息   我不想:捕获。结束。

     

所需的输出:

     

我想测试如果标题前有信息会发生什么   我在寻找。因此,我们在这里撒谎:并结束。开始:现在我们看到了所有   我们掌握的重要信息。伴随着:一堆。奇怪:   标头。我想强调所有。标头:并添加句点   在他们把信息分成不同的东西之前。句子:   现在我可以停止了,因为我打了结束标头。结束:更多信息   之后,我不想:捕获。结束。

enter image description here

以下代码将在每个标题之前添加句点。我正在苦苦挣扎的部分是将替换限制在字符串“ START:”和“ END:”之间 。现在,它正在各地添加周期。

sed -r "s/(\b(.?[[:upper:]]\w+)++:)/. \1/g" TestData.txt

我尝试浏览以前提出的解决方案,但没有一个对我有用,我认为这可能与以下事实有关:所有数据都在一行中 ,而不是多行。

所以实际上,我的数据文件看起来像这样:

I want to test what happens if there is information before the header I am looking for. Thus Here We Lie: And end. START: Now we see all the important information that we have Along With: a bunch of Strange: headers. I want to highlight all of the Headers: and add periods before them to separate the information into different Sentences: Now I can stop because I hit the end header. END: More information after that I do Not Want To: capture. The End.

编辑1:修复了现实字符串

1 个答案:

答案 0 :(得分:1)

如果可以使用并安装了GNU awk,则可以将其用作sed的替代版本。 \y\bsed的单词边界等效词,&awk上下文中匹配的捕获组。

gawk 'match($0, /(.+)START(.+)END(.+)/, arr){gsub(/(\y(.?[[:upper:]]\w+)++:)/,".&",arr[2]); print arr[1] "START"arr[2]"END" arr[3] }' file
相关问题