如何用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
相关产品推荐
相关产品推荐

