繁体   English   中英

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

[英]Execute command on the same line multiple times with sed

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

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 不会 sed

我可以只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

使用awk

awk '{for (i=1;i<=NF;i++) if (a[$i]++>=1) printf "*%s* ",$i; else printf "%s ",$i; print ""}' file
lol foo *lol* bar *foo* *bar*

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM