【发布时间】:2016-04-28 15:21:05
【问题描述】:
我有一个如下所示的字符串:
string=S1 s5 S0 s3 s2 S11 s13
必须将大写 S 的元素提取到另一个字符串,所以我想要这个:
string1=s5 s3 s2 s13
string2=S1 S0 S11
子字符串中元素的顺序无关紧要。
我写了一个这样的解决方案:
string1=$(echo $string | grep -o 's[^ ]\+')
string2=$(echo $string | grep -o 'S[^ ]\+')
它起作用了(我也用 grep -o 's[0-9]\+' 做到了,而不是 echo 做了
不幸的是,有时我的字符串可能只有大写的 S:
unfortunatestring=S0 S1 S5 S11 S2
脚本只是停在该行 string1=$(echo $string | grep -o 's[^]+')
但如果我使用 sh -x 在调试模式下运行我的脚本,一切正常。
我假设对无法返回值的 grep 执行命令替换会导致脚本停止,我的问题是为什么?我不介意 string1 是否为空,但我介意我的脚本是否停止。
你能不能给我一个解决方案,它总是会从字符串中创建 string1 和 string2,如果 string1 和 string2 为空也没问题。
我是 bash 新手,我认为这也可以使用 sed 或 awk 完成。
【问题讨论】:
-
这感觉就像XY Problem。如果你告诉我们你想用字符串做什么,我们可能会为你提供更好的帮助。
-
我输入的字符串有大写的 S 和非大写的 s 元素,并且后面总是跟数字,所以它看起来像 S1、s15、S3、s0、s1、s2 等,我想将大写的 S 元素分隔到另一个字符串中,不能更简单地解释。
-
稍后我将在 for 循环中使用带有小 s 的字符串来编写它们 kill s15、kill s0、kill s2 等(在单独的行中)——我已经这样做了!
-
用大写的 S 字符串我会做一些更复杂的事情,但我的脚本只有在我描述的情况下才会失败。
-
我无法复制挂起。你能创建一个MCVE 导致脚本在你的设置中挂起吗?