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

如何使用sed替换文本中未紧跟\n的@符号?

用sed替换未紧跟换行符的@符号

没问题,我来帮你搞定这个sed替换的需求!你的目标是只保留那些紧跟在换行符前的@符号,替换掉所有其他位置的@,对吧?下面给你两种可行的方案,适配不同的sed版本:

方案1:GNU sed(Linux系统默认)

如果你的环境是Linux,用GNU sed的话,可以借助负向先行断言来精准匹配,写法非常直观:

sed -E 's/@(?!$)/#/g' 你的文件名

命令解释:

  • -E:启用扩展正则表达式,让我们可以直接使用断言语法,不用额外转义
  • @(?!$):匹配所有**后面不是行尾(即不紧跟换行符)**的@符号。这里(?!$)是负向先行断言,意思是“@后面的位置不是行的结尾”
  • #:这里是你要替换成的目标字符,你可以改成任意内容(比如空字符串、其他符号)
  • g:全局替换,确保一行里所有符合条件的@都会被处理

示例:

假设输入文件内容是:

hello@world
foo@
bar@baz@qux

运行命令后输出:

hello#world
foo@
bar#baz#qux

可以看到,只有换行前的foo@里的@被保留了,其他位置的@都被替换成了#。

方案2:POSIX兼容sed(比如BSD sed/macOS默认)

如果你的环境是macOS或者使用POSIX标准的sed(不支持负向断言),可以用循环替换的方式实现:

sed ':loop; s/@\(.\)/#\1/; t loop' 你的文件名

命令解释:

  • :loop:定义一个循环标签,用于重复处理当前行
  • s/@\(.\)/#\1/:匹配@后面跟着任意一个非换行字符(因为sed默认逐行处理,.不会匹配换行),把@替换成#,同时保留后面的字符
  • t loop:如果上一次替换成功了,就跳回loop标签继续处理,直到当前行里没有符合条件的@为止

这个写法的逻辑是:只要@后面有字符(不是换行),就替换它;如果@在一行末尾(后面是换行),这个匹配就不会触发,自然保留下来。

同样的示例输入,运行后输出和方案1完全一致。

你只需要把命令里的#换成你实际需要的替换内容就可以啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:35:46