如何从字符串提取数字并单空格分隔?已试grep/awk/sed未果
提取字符串中数字并以单个空格分隔的解决方案
我来给你几个靠谱的解决办法,完美匹配你要的需求,解决之前那些命令处理不了非数字字符的问题:
方法1:用sed一步到位
这个命令可以直接完成所有处理,不需要组合其他工具:
sed -E 's/[^0-9]+/ /g; s/^ //; s/ $//'
拆解一下每个部分的作用:
s/[^0-9]+/ /g:把任意连续的非数字字符替换成单个空格,解决了你之前遇到的-、#等特殊字符无法处理的问题s/^ //:如果字符串开头有空格(比如开头就是非数字字符的情况),把开头的空格去掉s/ $//:同理,去掉结尾多余的空格
测试示例:
输入:ab#35jh71 1,2,3 kj$d3kjl23
运行命令后输出:35 71 1 2 3 3 23
方法2:grep+tr组合(更直观的分步处理)
如果你更喜欢分步操作,用grab提取数字再用tr转换格式:
grep -Eo '[0-9]+' | tr '\n' ' ' | sed 's/ $//'
各步骤作用:
grep -Eo '[0-9]+':提取所有连续的数字序列,每个序列单独占一行(之前你用的[0-9]只会提取单个数字,改成[0-9]+就能拿到完整的数字串)tr '\n' ' ':把所有换行符换成空格,把多行数字变成一行用空格分隔sed 's/ $//':去掉最后多余的空格
方法3:用awk处理
awk也能轻松完成这个任务,命令如下:
awk '{gsub(/[^0-9]+/, " "); sub(/^ /, ""); sub(/ $/, ""); print}'
解释:
gsub(/[^0-9]+/, " "):全局替换所有连续非数字字符为单个空格sub(/^ /, ""):移除开头的空格sub(/ $/, ""):移除结尾的空格print:输出最终处理后的结果
内容的提问来源于stack exchange,提问作者Lenna
相关产品推荐
相关产品推荐

