如何用Shell将单行文本在每个数字后拆分换行?
单行文本按数字串后拆分多行的Shell解决方案
需求回顾
输入示例:
a 111111b 222c 3d 444444
期望输出:
a 111111 b 222 c 3 d 444444
用gawk实现的方法
直接用gsub函数匹配数字串后跟字母的位置,替换成数字串加换行符加字母,就能完成拆分:
gawk '{gsub(/([0-9]+)([a-zA-Z])/, "\1\n\2"); print}' 你的文件名.txt
- 正则
([0-9]+)匹配连续的数字串,([a-zA-Z])匹配数字串后面紧跟的字母; "\1\n\2"把匹配到的部分替换成「数字串+换行+字母」,自然就把单行拆成了多行。
批量处理文件
如果要处理一批.txt文件,不想手动逐个输入文件名,可以用循环生成拆分后的新文件(避免覆盖原文件):
for file in *.txt; do gawk '{gsub(/([0-9]+)([a-zA-Z])/, "\1\n\2"); print}' "$file" > "${file%.txt}_split.txt" done
执行后,每个原文件会对应生成一个带_split后缀的拆分后文件。
备选:用sed实现
如果习惯用sed,也可以用替换命令完成,GNU sed直接用:
sed 's/\([0-9]\+\)\([a-zA-Z]\)/\1\n\2/g' 你的文件名.txt
如果是macOS等用BSD sed的系统,需要加-E参数简化正则写法:
sed -E 's/([0-9]+)([a-zA-Z])/\1\n\2/g' 你的文件名.txt
内容的提问来源于stack exchange,提问作者PrettySpooky
相关产品推荐
相关产品推荐

