作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有人知道使用单个命令、sed 或 awk 将“40900000”转换为“409-00-000”的方法。我已经用 sed 尝试了几种方法,但一点运气都没有。我需要批量执行此操作,大约有 40k 行,其中一些行不正确,因此需要修复它们。
提前致谢
最佳答案
使用 GNU sed,我会这样做:
sed -r 's/([0-9]{3})([0-9]{2})([0-9]{3})/\1-\2-\3/' filename
# or, equivalently
sed -E 's/([0-9]{3})([0-9]{2})([0-9]{3})/\1-\2-\3/' filename
-r
或 -E
启用扩展正则表达式模式,这避免了转义所有括号的需要\1
是第一个捕获组(( )
之间的位)[0-9]
表示0到9的范围{3}
表示前面的字符或范围的三个编辑:感谢所有评论。
在其他缺少 -r
开关或其别名 -E
的系统上,您必须转义 ( )
和 { }
上面。剩下的就是:
sed 's/\([0-9]\{3\}\)\([0-9]\{2\}\)\([0-9]\{3\}\)/\1-\2-\3/' filename
以重复为代价,您可以通过简单地重复 [0-9]
来避免一些转义:
sed 's/\([0-9][0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9][0-9]\)/\1-\2-\3/' filename
郑重声明,Perl 同样有能力做这类事情:
perl -pwe 's/(\d{3})(\d{2})(\d{3})/$1-$2-$3/' filename
-p
表示打印-w
表示启用警告-e
表示执行一行\d
是“数字”字符类(零到九)关于bash - 从 40900000 拆分为 409-00-000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22378009/
我是一名优秀的程序员,十分优秀!