我想将1234567890等数字更改为456-7890;有没有办法在Unix Shell编程中执行此操作?
答案 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有一些好处: