【问题标题】:Split a string based on character using BASH variable parameters使用 BASH 变量参数根据字符拆分字符串
【发布时间】:2018-11-20 03:12:19
【问题描述】:

假设我有一个由命令序列组成的字符串:

s1="c1|c2|c3>c4"

s2="c1>c2|c3|c4"

我想把这些字符串分成两个字符串。第一个字符串将是第一个命令c1。第二个字符串将是剩余的命令(以及管道和重定向)。

我可以很容易地得到第一个命令:

echo ${s1%%[>|]*} c1

echo ${s2%%[>|]*} c1

但是获取第二个字符串并不是那么简单:

我得到了什么:

echo ${s1#*[>|]} c2|c3>c4 echo ${s2#*[>|]} c2|c3>c4

我想要什么:

|c2|c3>c4

>c2|c3>c4

总而言之,如果我有一个复合命令,其中一个命令通过管道传输或重定向到其他命令,我想将第一个命令拆分为一个字符串,并将其余命令拆分为另一个字符串。包括所有管道和重定向。

【问题讨论】:

    标签: string bash


    【解决方案1】:

    捕获变量中的“c1”部分,然后,从原始字符串的开头,删除捕获的文本:

    $ cmd=${s1%%[>|]*}; echo "$cmd"; echo "${s1#"$cmd"}"
    c1
    |c2|c3>c4
    
    $ cmd=${s2%%[>|]*}; echo "$cmd"; echo "${s2#"$cmd"}"
    c1
    >c2|c3|c4
    

    这甚至在字符串包含全局字符时也有效:

    $ s2="c1*>c2|c3|c4"
    $ cmd=${s2%%[>|]*}; echo "$cmd"; echo "${s2#"$cmd"}"
    c1*
    >c2|c3|c4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      相关资源
      最近更新 更多