如何使用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>/'- 缺少全局替换标记
g,仅替换每行第一个匹配项,导致多@的行无法完全处理; - 未限制@的前置字符,会错误匹配
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
相关产品推荐
相关产品推荐

