从40900000分割到409-00-000

Sun*_*ren 2 bash awk sed

有没有人知道用单个命令,sed或awk将"40900000"转换为"409-00-000"的方法.我已经尝试了几种方式与sed但没有运气.我需要批量执行此操作,大约有40k行,其中一些行不正确,因此需要修复它们.

提前致谢

Tom*_*ech 5

使用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
Run Code Online (Sandbox Code Playgroud)
  • -r-E能够扩展的正则表达式模式,它避免了需要逃避所有的括号
  • \1是第一个捕获组(位于其间的位( ))
  • [0-9] 表示从零到九的范围
  • {3} 表示前面的字符或范围中的三个

编辑:感谢您的所有评论.

在缺乏其他系统-r开关,或它的别名-E,你必须躲避( ){ }上面.这让你:

sed 's/\([0-9]\{3\}\)\([0-9]\{2\}\)\([0-9]\{3\}\)/\1-\2-\3/' filename
Run Code Online (Sandbox Code Playgroud)

以重复为代价,您可以通过简单地重复以下内容来避免一些逃脱[0-9]:

sed 's/\([0-9][0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9][0-9]\)/\1-\2-\3/' filename
Run Code Online (Sandbox Code Playgroud)

为了记录,Perl同样能够做到这一点:

perl -pwe 's/(\d{3})(\d{2})(\d{3})/$1-$2-$3/' filename
Run Code Online (Sandbox Code Playgroud)
  • -p 意思是打印
  • -w 意味着启用警告
  • -e 意味着执行一行
  • \d 是"数字"字符类(从零到九)