如何在sed中实现多条件匹配插入逗号,将文本转CSV?
使用sed实现带“或”逻辑的文本转CSV
sed完全支持“或”逻辑,通过正则表达式的分支语法即可实现。针对你遇到的文本转CSV场景(第一列最长30字符,两种列分隔情况),可以用以下sed命令完成转换:
解决方案命令
sed -e 's/^\(.\{30\}\)/\1,/' -e 's/\(^[^ ]\+\) */\1,/' input.txt > output.csv
命令解释
- 处理第一列满30字符的情况:
s/^\(.\{30\}\)/\1,/匹配行首的30个任意字符,将其替换为这30个字符加逗号,实现直接在第一列末尾插入分隔符。 - 处理第一列不足30字符的情况:
s/\(^[^ ]\+\) */\1,/匹配行首的非空格内容(第一列)及其后续的任意数量空格,将其替换为第一列内容加逗号,把空格分隔转为逗号分隔。
效果验证
针对你的示例输入:
column 1 column 2 column1-value-up-to-30-charssscolumn2-value column1-second-value column2-second-value column1-third-value-value column2-thrid-value-value
执行命令后将得到预期的CSV格式:
column 1,column 2 column1-value-up-to-30-charsss,column2-value column1-second-value,column2-second-value column1-third-value-value,column2-thrid-value-value
关于sed的“或”逻辑补充
如果你想在单个正则表达式中使用“或”逻辑,可以启用扩展正则(加-r或-E参数),用|分隔不同匹配规则。比如上述需求也可以合并为:
-r 's/^(.{30})(.*)$/\1,\2/; s/^(.*?) +/\1,/' input.txt > output.csv
不过分开写两个规则逻辑更清晰,且两种场景互斥,不会出现重复替换问题。
内容的提问来源于stack exchange,提问作者GTGabaaron
相关产品推荐
相关产品推荐

