假设我有一个由命令序列组成的字符串:
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
总而言之,如果我有一个复合命令,其中一个命令通过管道传输或重定向到其他命令,我想将第一个命令拆分为一个字符串,将剩余的命令拆分为另一个字符串。包括所有管道和重定向。
答案 0 :(得分:0)
捕获" c1"然后,从原始字符串的开头部分变量,删除捕获的文本:
$ cmd=${s1%%[>|]*}; echo "$cmd"; echo "${s1#"$cmd"}"
c1
|c2|c3>c4
$ cmd=${s2%%[>|]*}; echo "$cmd"; echo "${s2#"$cmd"}"
c1
>c2|c3|c4
当字符串包含glob字符时,这甚至可以工作:
$ s2="c1*>c2|c3|c4"
$ cmd=${s2%%[>|]*}; echo "$cmd"; echo "${s2#"$cmd"}"
c1*
>c2|c3|c4