csplit正则匹配[]内任意多位数字 实现按Template[n]分割文本
问题根因
csplit 默认采用POSIX基础正则(BRE)语法,你之前写的[0-9]+不生效,是因为BRE规则下+不会被默认识别为「匹配1次及以上」的量词,未转义的+只会匹配字面的加号字符,自然无法命中多位数序号。带括号的([0-9]+)写法额外多了无意义的分组括号,BRE中未转义的括号同样只会匹配字面量括号,匹配逻辑完全错误。
可用方案
全环境兼容写法(推荐)
不需要依赖任何扩展正则特性,所有系统自带的csplit都能正常运行,支持任意长度的数字序号:
csplit -k cert_templates.txt '/Template\[[0-9][0-9]*\]:/' {*}
写法逻辑:第一个[0-9]匹配序号的第一个数字,后续[0-9]*匹配0个或多个数字,组合后等价于「匹配1个及以上任意长度的数字」,无论序号是1位、2位还是上百位都能正常命中。
GNU csplit 简化写法
如果是Linux环境常用的GNU版本csplit,可以给+加转义符让BRE识别量词含义,写法更简洁:
csplit -k cert_templates.txt '/Template\[[0-9]\+\]:/' {*}
扩展正则写法
如果你的csplit版本支持-E参数开启扩展正则(ERE),可以直接用更符合直觉的正则写法,不需要转义量词:
csplit -k -E cert_templates.txt '/Template\[[0-9]+\]:/' {*}
注:你之前写的固定匹配两位数字的写法
[0-9][0-9]只能覆盖10-99的序号,本质是硬编码匹配两个数字,没有用量词做可变长度匹配,自然无法支持3位及以上序号。
内容的提问来源于stack exchange,提问作者linuxsiarz
相关产品推荐
相关产品推荐

