【问题标题】:How to split a string in shell如何在shell中拆分字符串
【发布时间】:2013-03-02 20:12:18
【问题描述】:

我有一个变量

string="ABC400p2q4".

如何将ABC400p2q4 分开。 我需要将它分成两个变量,结果我得到

echo $var1
ABC400
echo $var2
p2q4

可以用任何字母字符代替 ABC;可以用任何其他数字代替 400;但是pq 是固定的,可以代替2 和4 有任何数字。

【问题讨论】:

  • 什么外壳?至少有几十个。
  • 其他值呢;分裂的标准是什么?是前 6 个字符和后 4 个字符(但如果长度不是 10 会发生什么)?是 ABC 加 3 位数字还是尾随材料?是 3 个大写字母、3 个数字和尾随材料吗?它在第一个'p'之前分裂吗?对于您声明的任务:var1=ABC400; var2=p2q4 完成了这项工作,没有麻烦,没有大惊小怪。
  • 信息太少。你的字符串有什么模式/规则吗?
  • 可以用任何 albhabet 代替 ABC,可以用任何其他数字代替 400,bt p 和 q 是固定的,也可以用任何数字代替 2 和 3。

标签: regex string bash shell


【解决方案1】:

如果您的字符串保持单一长度,sudo_O 提供的答案是完美的。但是,如果不是这样,bash 确实会为您提供string regex matching builtins

$ string="ABC400p2q4"

$ var1=$( expr match "$string" '\(.{6}\)' )

$ var2=$( expr match "$string" '.*\(.{4}\)' )

用您实际需要的任何内容替换正则表达式。

【讨论】:

    【解决方案2】:

    尝试这样做

    使用 & process substitution(非固定长度):

    read var1 var2 < <(sed -r 's/^[a-zA-Z]+[0-9]+/& /' <<< 'ABC400p2q4')
    

    或者这个使用 here-string

    read var1 var2 <<< $(sed -r 's/^[a-zA-Z]+[0-9]+/& /' <<< 'ABC400p2q4')
    

    或使用来自Kent 的简短sed substitution 版本

    's/([0-9])p/\1 p/'
    

    注意

    sed 命令中的&amp; 代表替换 s///

    的匹配左侧部分

    输出

    $ echo $var1
    ABC400
    $ echo $var2
    p2q4
    

    【讨论】:

    • +1 表示空间创意。根据他的描述,我认为这也有效? sed -r 's/([0-9])p/\1 p/'
    • 就像在 Perl 中一样,还有不止一种方法可以做到这一点 =) 也添加了您的解决方案
    【解决方案3】:

    使用 和特殊的BASH_REMATCH 数组(非固定长度):

    $ string='ABC400p2q4'
    $ [[ $string =~ ^([a-zA-Z]+[0-9]+)(.*) ]]
    $ echo ${BASH_REMATCH[1]}
    ABC400
    $ echo ${BASH_REMATCH[2]}
    p2q4
    

    【讨论】:

      【解决方案4】:

      无需基于正则表达式模式进行拆分,因为它们是固定长度的子字符串。在纯 bash 你会这样做:

      $ string="ABC400p2q4"
      
      $ var1=${string:0:6}
      
      $ var2=${string:6}
      
      $ echo $var1
      ABC400
      
      $ echo $var2
      p2q4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-23
        • 1970-01-01
        • 1970-01-01
        • 2011-03-10
        • 2011-06-26
        • 2017-06-06
        • 2014-12-25
        相关资源
        最近更新 更多