我需要用*符号突出显示文本中的每个重复单词.
例如
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吗?
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)