我想找到在字符串“ START:”和“ END:”之间出现一个或多个大写字母后跟冒号“:”的所有实例。然后,我想在每个实例之前添加一个句点。
示例输入:
我想测试如果标题前有信息会发生什么 我在寻找。因此,我们在这里撒谎:并结束。开始:现在我们看到了所有 我们拥有的重要信息:一堆奇怪的东西: 标头。我要突出显示所有标题:并添加句点 在他们面前将信息分为不同的句子:现在 我可以停下来,因为我打了结束头。结束:之后的更多信息 我不想:捕获。结束。
所需的输出:
我想测试如果标题前有信息会发生什么 我在寻找。因此,我们在这里撒谎:并结束。开始:现在我们看到了所有 我们掌握的重要信息。伴随着:一堆。奇怪: 标头。我想强调所有。标头:并添加句点 在他们把信息分成不同的东西之前。句子: 现在我可以停止了,因为我打了结束标头。结束:更多信息 之后,我不想:捕获。结束。
以下代码将在每个标题之前添加句点。我正在苦苦挣扎的部分是将替换限制在字符串“ 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:修复了现实字符串
答案 0 :(得分:1)
如果可以使用并安装了GNU awk
,则可以将其用作sed
的替代版本。 \y
是\b
中sed
的单词边界等效词,&
是awk
上下文中匹配的捕获组。
gawk 'match($0, /(.+)START(.+)END(.+)/, arr){gsub(/(\y(.?[[:upper:]]\w+)++:)/,".&",arr[2]); print arr[1] "START"arr[2]"END" arr[3] }' file