Bourne shell脚本将数字转换为电话格式

时间:2009-10-18 20:36:41

标签: unix shell

我想将1234567890等数字更改为456-7890;有没有办法在Unix Shell编程中执行此操作?

5 个答案:

答案 0 :(得分:3)

@OP,您已经提供了有关更改号码条件的详细信息。你可以在你的solaris 10上使用bash来做到这一点,在你的情况下不需要花哨的正则表达式。

 $ n=1234567890    
 $ echo "${n:3:3}-${n:6}"
 456-7890

答案 1 :(得分:2)

DigitalRoss Jonathan Leffler 试图说:

echo "1234567890"|sed 's/[0-9][0-9][0-9]\([0-9][0-9][0-9]\)\([0-9][0-9][0-9][0-9]\)/\1-\2/'

这应该适用于除sed最为脑死亡的版本以外的所有版本,但它不关注字边界等,或者是否在同一行上有其他数字或数字组。它只是重新格式化它找到的前十位数序列。如果您有空格,制表符,逗号或其他分隔符,则可以使用它们来进一步限制匹配。

答案 2 :(得分:1)

$ sed -e 's/...\(...\)\(....\)/\1-\2/'
1234567890
456-7890

您可以更仔细地选择数字字符串单词,但不是很完美,使用:

sed -e 's/\b[0-9]..\([0-9]..\)\([0-9]...\)\b/\1-\2/'

答案 3 :(得分:1)

天儿真好,

不要忘记锚点来获取字符串的最后七位数字。类似的东西:

echo "1234567890" | sed -e 's/\([0-9]{3}\)\([0-9]{4}\)$/\1-\2/'

HTH

欢呼声,

答案 4 :(得分:0)

Shell脚本基本上只是一堆命令,管道连接在一起,您可以像调用/ awk / grep一样简单地调用任何脚本语言(例如Python / Ruby / Perl)。

例如,使用Ruby:

$ echo "Change 1234567890 to 456-7890" | ruby -e 'puts $stdin.read.gsub(/\d{3}(\d{3})(\d{3})/){|x| "#{$1}-#{$2}"}'

..输出:

Change 456-7890 to 456-7890

使用(例如)Ruby over sed有一些好处:

  • Ruby / etc在多个平台上将比sed / awk / grep更加一致,它们往往采用不同的参数和功能略有不同,具体取决于使用的操作系统/分发
  • 如果命令变得更复杂,将其转换为“正确”脚本
  • 是微不足道的