You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用grep/sed/awk结合正则拆分含小数、运算符与括号的输入行?

可以实现!以下是具体实现方案

完全可以通过 grep、sed、awk 搭配正则表达式完成这个分词并以逗号分隔的需求,下面分工具给出具体实现:

1. 使用 grep + paste 实现

利用 grep 的 -o 选项提取所有匹配的 token,再将换行替换为逗号:

echo "2 + 5* 61.2 -(32.5+7)/ 8" | grep -oP '[0-9]+(\.[0-9]+)?|[-+*/()]' | paste -sd ',' -

解释:

  • -oP:-o 表示只输出匹配的部分,-P 启用 Perl 兼容正则表达式
  • 正则 [0-9]+(\.[0-9]+)? 匹配整数(如2、7)或小数(如61.2、32.5)
  • [-+*/()] 匹配所有运算符和括号
  • paste -sd ',' - 将所有行用逗号连接,避免末尾多余逗号

2. 使用 sed 实现

通过 sed 的替换功能,先清除空白字符,再给每个 token 添加逗号,最后去掉末尾多余的逗号:

echo "2 + 5* 61.2 -(32.5+7)/ 8" | sed -E 's/[[:space:]]+//g; s/([0-9]+(\.[0-9]+)?|[-+*/()])/\1,/g; s/,$//'

解释:

  • s/[[:space:]]+//g:清除所有空格和制表符
  • s/([0-9]+(\.[0-9]+)?|[-+*/()])/\1,/g:匹配每个 token,替换为「token+逗号」
  • s/,$//:删除字符串末尾的多余逗号

3. 使用 awk 实现

借助 awk 的 FPAT 变量定义字段的匹配规则,直接将每个字段用逗号分隔输出:

echo "2 + 5* 61.2 -(32.5+7)/ 8" | awk -v FPAT='[0-9]+(\\.[0-9]+)?|[-+*/()]' -v OFS=',' '{$1=$1; print}'

解释:

  • FPAT:定义每个字段的匹配模式,这里就是我们的 token 正则
  • OFS=',':设置输出字段分隔符为逗号
  • $1=$1:触发 awk 重新构建记录,用 OFS 分隔所有字段
  • print:输出处理后的记录

三个工具的命令运行后,都会得到你需要的输出:

2,+,5,*,61.2,-,(,32.5,+,7,),/,8

内容的提问来源于stack exchange,提问作者Troskyvs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 09:24:20