如何使用awk实现每匹配4次.txt后缀才执行sub替换重命名
解决方案
直接运行以下awk命令即可实现需求:
awk '/\.txt/{if(++match_cnt %4 == 0) sub(/\.txt/, ++replace_cnt "&")}1' 1.txt > 3.txt
实现逻辑说明
- 命令内置两个隐式初始化的计数器(awk变量默认初始值为0):
match_cnt:累计统计匹配到.txt后缀的次数replace_cnt:统计实际执行替换操作的次数
- 每行匹配到
.txt时先给match_cnt加1,判断match_cnt是否为4的整数倍:- 是则执行替换:将
.txt替换为替换次数+.txt,同时替换计数自增 - 否则不做修改直接输出
- 是则执行替换:将
- 末尾的
1是awk默认输出规则,会输出所有处理后的行内容
原有代码的问题
- 后自增逻辑
n++==4的判断会导致触发替换的匹配位置错位:第一次满足条件时是第5次匹配,和要求的第4次匹配替换不符 - 没有用模运算做周期判断,只会触发1次替换,无法实现每4次匹配替换一次的周期性要求
内容的提问来源于stack exchange,提问作者7beggars_nnnnm
相关产品推荐
相关产品推荐

