如何使用Sed生成名称组合的所有可能替换变体?
使用Sed生成名称组合的所有替换变体
要实现你需要的「每个位置保留原字符或替换为指定符号」的所有组合生成,我们可以利用Sed的分支标签(t命令)和替换特性来递归生成所有笛卡尔积,以下是具体方案:
核心Sed脚本
先创建一个Sed脚本文件(比如generate_variants.sed),内容如下:
# 处理A的替换选项:保留A或替换为1 :process_A s/\(A\)\(.*\)/\1\2\n1\2/ t process_A # 处理B的替换选项:保留B或替换为2 :process_B s/\(B\)\(.*\)/\1\2\n2\2/ t process_B # 处理C的替换选项:保留C或替换为3 :process_C s/\(C\)\(.*\)/\1\2\n3\2/ t process_C # 移除可能产生的开头空行 s/^\n//
执行方式
在终端中运行以下命令:
sed -f generate_variants.sed <<< "ABC"
执行后你会得到所有8种组合(包含你列出的7种+全替换的123):
ABC AB3 A2C A23 1BC 1B3 12C 123
如果不需要全替换的123,可以用grep过滤:
sed -f generate_variants.sed <<< "ABC" | grep -v '123'
脚本原理
这个脚本的核心是利用Sed的t命令(如果替换成功则跳转到指定标签)来递归生成每个字符的两种可能:
- 对
A:每次替换会把当前行拆分为「保留A的行」和「替换为1的行」,直到所有可能的A替换都完成 - 接着处理
B,对已生成的每行重复拆分逻辑 - 最后处理
C,完成所有组合的生成 - 最后清理开头可能出现的空行
扩展规则
如果需要添加更多替换规则(比如D→4),只需要新增对应的处理块即可:
:process_D s/\(D\)\(.*\)/\1\2\n4\2/ t process_D
内容的提问来源于stack exchange,提问作者Hippo
相关产品推荐
相关产品推荐

