Bash中如何使用awk按匹配到的数字模式分割文件内容
问题根因
你之前的命令跑不通是两个错误导致的:
- 给awk的
-F参数传正则分隔符时,不需要额外在正则外面套/ /,你写的-F'/^[-+]?[0-9]+$/'实际是把/^[-+]?[0-9]+$/这串字面字符当成分隔符,根本匹配不到文本里的内容 - 你用的正则
^[-+]?[0-9]+$本身逻辑不符合需求:这个正则是匹配「整行从头到尾全是数字」的场景,但你的数字是嵌在一整行长文本中间的,而且你需要保留数字作为拆分后每行的开头,根本不能把数字当成分隔符切掉。
正确实现方案
别用字段分割的思路绕弯,直接逐段匹配「数字开头+后面所有非数字内容」的片段,循环输出即可,命令如下:
cat text | awk '{ while(match($0, /[0-9]+[^0-9]+/)) { print substr($0, RSTART, RLENGTH); $0 = substr($0, RSTART+RLENGTH) } }'
命令里的正则/[0-9]+[^0-9]+/逻辑很简单:先匹配1个及以上的数字,再匹配后面跟着的所有非数字内容,每匹配到一段就打印,再把已经处理过的内容从原字符串里切掉,循环到整行文本处理完为止。
执行后输出的结果和预期完全一致:
1Lorem ipsum dolor sit amet, consectetur adipiscing elit. 2Vivamus dictum, justo mattis sollicitudin pretium, ante magna gravida ligula, 3a condimentum libero tortor sit amet lectus. Nulla congue mauris quis lobortis interdum. 4Integer eget ante mattis ante egestas suscipit. Suspendisse imperdiet pellentesque risus, a luctus sem pellentesque nec. Curabitur vel luctus eros. Morbi id magna sit amet 5risus hendrerit porta. Praesent vitae sapien in nunc aliquet pharetra vitae sed lectus. Donec id magna magna. Phasellus eget rhoncus purus, vitae vestibulum nisl. 6Phasellus massa mi, ultricies id mi sit amet, tristique auctor mi.
内容的提问来源于stack exchange,提问作者Francisco de Javier
相关产品推荐
相关产品推荐

