用sed多次在同一行执行命令

Dan*_*any 6 regex linux sed

我需要用*符号突出显示文本中的每个重复单词.
例如

lol foo lol bar foo bar
Run Code Online (Sandbox Code Playgroud)

应该

lol foo *lol* bar *foo* *bar*
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下命令:

echo "lol foo lol bar foo bar" | sed -r -e 's/(\b[a-zA-Z]+\b)([^*]+)(\1)/\1\2*\3*/'
Run Code Online (Sandbox Code Playgroud)

它给了我:

lol foo *lol* bar foo bar
Run Code Online (Sandbox Code Playgroud)

然后我添加了g标志:

lol foo *lol* bar foo *bar*
Run Code Online (Sandbox Code Playgroud)

foo没有突出显示.
我知道发生这种情况是因为sed 如果发现匹配,就不会落后.

我可以只处理它sed吗?

Bir*_*rei 4

Sed不是完成此任务的最佳工具。它不向前看、向后看和非贪婪量词,但尝试以下命令:

sed -r -e ':a ; s/\b([a-zA-Z]+)\b(.*) (\1)( |$)/\1\2 *\3* / ; ta'
Run Code Online (Sandbox Code Playgroud)

它使用条件分支来执行替换命令,直到失败。另外,您无法检查,([^*]+)因为对于第二轮,它必须遍历一些*第一个替换,您的选项是贪婪的.*。最后,您不能仅仅因为它会一次又一次地(\1)匹配第一个字符串而进行匹配。lol您需要一些上下文,例如被空格包围或行尾。

该命令产生:

lol foo *lol* bar *foo* *bar*
Run Code Online (Sandbox Code Playgroud)

更新: potong在评论中提供的改进:

sed -r ':a;s/\b(([[:alpha:]]+)\s.*\s)\2\b/\1*\2*/;ta' file
Run Code Online (Sandbox Code Playgroud)