如何使用sed将文件中作为计数器的数字定量替换为对应重复次数的指定字符串
Sed实现方案:将数字替换为对应次数的气球标识
这有个直接能用的sed命令,完美匹配你把数字转换成对应重复次数的red/blue列表项的需求:
sed ' # 处理第一个数字行(对应red的重复次数) /^ - [0-9]\+/{ s/^ - //; h # 提取数字并存入sed的临时存储区(hold space) s/.*/ - red/ # 将当前行替换为red的列表项格式 :loop_red # 定义循环标签 g # 从临时存储区取出数字 s/^\([0-9]\)\(.*\)/\1-1/ # 数字减1 s/^0.*// # 如果减到0就清空内容 t end_red_loop # 若内容为空(数字到0),跳转到循环结束标签 x # 交换当前行和临时存储区的内容 p # 打印red列表项 b loop_red # 回到循环开头继续执行 :end_red_loop # 循环结束标签 x # 换回内容 d # 删除原始数字行 } # 处理第二个数字行(对应blue的重复次数) /^ - [0-9]\+/{ s/^ - //; h s/.*/ - blue/ :loop_blue g s/^\([0-9]\)\(.*\)/\1-1/ s/^0.*// t end_blue_loop x p b loop_blue :end_blue_loop x d } ' input.txt
命令细节解释
- 匹配目标行:通过
/^ - [0-9]\+/精准抓取列表里的数字行,分两次处理(第一次对应red,第二次对应blue) - 存储数字:先用
s/^ - //去掉列表前缀,再用h把纯数字存入sed的临时存储区,方便后续循环计数 - 生成初始列表项:把当前数字行直接替换成
- red或- blue的格式 - 循环打印逻辑:
- 每次从临时存储区取出数字并减1
- 如果数字还没到0,就打印当前的气球列表项,然后回到循环继续
- 当数字减到0时,退出循环并删掉原始的数字行,避免残留
测试方式
把你的输入内容保存为input.txt,执行上面的命令,就能得到预期输出:
balloons: - red - red - blue - blue - blue
这个方案支持任意正整数数字,完全适配你说的“数字随不同文件变化”的场景。
内容的提问来源于stack exchange,提问作者VMold
相关产品推荐
相关产品推荐

