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

sed不支持正向预查?求替代Linux命令实现文本替换

实现特定文本替换的替代方案

问题场景

现有文件example.txt内容如下:

# cat example.txt
tested
tests
testing

需求:仅当test后未跟随ed或s时,将其替换为work,预期输出:

tested
tests
working

由于sed默认不支持Perl风格的正向否定预查(?!...),导致原sed命令无法生效,以下是三种简便的Linux命令解决方案:


方案1:使用Perl命令

Perl原生支持正向预查语法,直接复用你原本的正则逻辑即可:

perl -pe 's/test(?!ed|s)/work/g' example.txt

执行后直接输出预期结果。

方案2:使用GNU sed的替代正则写法

如果依赖sed工具,可通过POSIX扩展正则模拟需求逻辑,避免预查语法:

sed -E 's/test(ed|s)/&/g; s/test/work/g' example.txt

逻辑说明

  1. 先匹配tested和tests并保留原内容(&代表匹配到的整段内容)
  2. 再将剩余未被匹配的test替换为work

方案3:使用awk命令

通过条件判断实现精准替换:

awk '{
    if ($0 ~ /tested$/ || $0 ~ /tests$/) {
        print $0
    } else if ($0 ~ /test/) {
        sub(/test/, "work")
        print $0
    } else {
        print $0
    }
}' example.txt

逻辑说明

  • 若行以tested或tests结尾,直接输出原内容
  • 若行包含test但不属于上述情况,替换test为work后输出
  • 其他行直接输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:20:37