You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用sed正确替换以@开头的独立单词为<@MENTION>

用sed替换独立@开头单词为<@MENTION>的解决方案

需求说明

需将文件中独立的以@开头的单词替换为<@MENTION>,要求:

  • @前面不能是单词字符(如called@User中的@不匹配)
  • @后仅跟随字母、数字或下划线
  • 示例输入输出如下:

示例输入:

I have 6 @emailaddresses and 10% of the people don't eat sandwiches!
I have six @emailaddresses and 10%...  @123_Username @BAPP,
you shouldn't say that! I recently called@User but he didn't answer.
@Username is not a nice person! This @username guy is really cool!

期望输出:

I have 6 <@MENTION> and 10% of the people don't eat sandwiches!
I have six <@MENTION> and 10%...  <@MENTION> <@MENTION>,
you shouldn't say that! I recently called@User but he didn't answer.
<@MENTION> is not a nice person! This <@MENTION> guy is really cool!

之前命令的问题分析

  • 命令1:sed 's/@[a-zA-Z0-9_]*/<@MENTION>/'

    1. 缺少全局替换标记g,仅替换每行第一个匹配项,导致多@的行无法完全处理;
    2. 未限制@的前置字符,会错误匹配called@User中的@User部分,不符合「独立单词」的要求。
  • 命令2:sed -E -e 's/\b@[a-zA-Z0-9_]*\b/<@MENTION>/'
    \b是单词边界,仅匹配「单词字符与非单词字符的交界」。@属于非单词字符,\b@实际匹配的是「单词字符+@」的组合(如called@),完全无法匹配行首或空格后的@,因此无效。

正确命令及解释

使用扩展正则的sed命令:

sed -E 's/(^|\W)@[a-zA-Z0-9_]+(\W|$)/\1<@MENTION>\2/g'

各部分作用:

  • -E:启用扩展正则表达式,简化语法书写;
  • (^|\W):捕获行首或非单词字符(空格、标点等),确保@前面没有单词字符;
  • @[a-zA-Z0-9_]+:匹配@开头,且后续至少有一个字母/数字/下划线(避免替换孤立的@符号);
  • (\W|$):捕获非单词字符或行尾,确保@后的内容是独立单元;
  • \1<@MENTION>\2:保留前后的非单词字符/行首行尾,仅替换中间的@开头单词;
  • g:全局替换标记,处理一行内所有符合条件的匹配项。

若需要支持孤立@符号的替换,可将+改为*。


内容的提问来源于stack exchange,提问作者Michael Gauthier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:27:14