gpt4 book ai didi

regex - 使用sed在同一行多次执行命令

转载 作者:IT王子 更新时间:2023-10-29 00:53:22 24 4
gpt4 key购买 nike

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

lol foo lol bar foo bar

应该是

lol foo *lol* bar *foo* *bar*

我尝试使用以下命令:

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

它给了我:

lol foo *lol* bar foo bar

然后我添加了g标志:

lol foo *lol* bar foo *bar*

但是 foo 没有高亮。
我知道这是因为 sed doesn't look behind if the match was found .

我可以只用 sed 处理吗?

最佳答案

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

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

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

命令产生:

lol foo *lol* bar *foo* *bar*

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

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

关于regex - 使用sed在同一行多次执行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19060719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com