【问题标题】:how to separate a 10-digit phone number into two parts如何将一个 10 位数的电话号码分成两部分
【发布时间】:2013-05-26 12:46:59
【问题描述】:

例如,我得到一个像9191234567 这样的电话号码,我怎么能把它分成两部分,第一部分包含前三位数字919,另一部分包含其余七位数字1234567?之后,我想将这两部分存储到ksh中的两个不同的变量中。

不知道sed能不能做到这一点?

【问题讨论】:

  • 把它们分成两部分,然后用它们做什么?将它们写入标准输出,中间有空格?
  • 0-2 的子串,然后是 3-9 的另一个子串?
  • @JoachimIsaksson:分离后,我想将这两个部分存储到两个不同的脚本变量中,可以这样吗?

标签: sed ksh


【解决方案1】:

你可以试试这个:

echo "9191234567" | sed 's/^\([0-9]\{3\}\)\([0-9]\{7\}\)$/\1 \2/'

要将每个部分存储在单独的变量中,您可以这样做:

phone="9191234567"
part1=$(echo $phone | sed 's/^\([0-9]\{3\}\)[0-9]\{7\}$/\1/')
part2=$(echo $phone | sed 's/^[0-9]\{3\}\([0-9]\{7\}\)$/\1/')

或者更简洁:

read part1 part2 <<< $(echo "9191234567" | sed 's/^\([0-9]\{3\}\)\([0-9]\{7\}\)$/\1 \2/')

【讨论】:

  • 谢谢。我可以将这些\1 和\2 存储到两个脚本变量中吗?
  • 好把戏,埃里克!但看起来ksh 或ksh93 都不支持运算符&lt;&lt;&lt;。
  • 哎哟...好的。我用破折号,所以我不知道。我以为它是受支持的。好吧,我想您将不得不使用第二种解决方案。 :)
  • 是的,第二个解决方案效果很好。遗憾的是,bash 在 AIX 机器中并不总是可用,:(
  • @QiangXu,如果你的ksh版本没有here-strings,它可能有进程替换:read part1 part2 &lt; &lt;(echo "9191234567" | sed 's/^.../&amp; /')
【解决方案2】:
echo 9191234567 | sed 's/^\([1-9]\{3\}\)\([1-9]*\)/\1\-\2/'

将打印919-1234567

【讨论】:

    【解决方案3】:

    cut 应该可以工作

    echo '9191234567' | cut --characters 1-3,4- --output-delimiter ' '
    919 1234567
    

    【讨论】:

      【解决方案4】:

      使用bash

      $ phone=9191234567
      $ regex="^([0-9]{3})([0-9]{7})$"
      $ [[ $phone =~ $regex ]] && part1="${BASH_REMATCH[1]}" && part2="${BASH_REMATCH[2]}"
      $ echo $part1
      919
      $ echo $part2
      1234567
      

      【讨论】:

      • 不错的一个! :) 不知道这个变量。
      • @EricCitaire 谢谢埃里克,实际上这个答案不应该发布,因为它在 OP 的外壳上不可用。我只是将其发布为其他人的参考。 :)
      【解决方案5】:

      纯ksh,取数字,打印为两个单独的字符串,用空格隔开。

      function split_at_third {
          typeset number=$1 a b
          b=${number#???} && a=${number%$b}
          print $a $b
      }
      

      【讨论】:

        猜你喜欢
        • 2017-06-17
        • 2012-09-14
        • 2015-10-26
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多