为什么grep在脚本内而不是在命令行中失败

时间:2016-04-28 15:21:06

标签: bash shell awk sed grep

我有一个看起来像这样的字符串:

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做了<<<<<<<<<<<<<<<<<<<<<<<< / p>

不幸的是,有时可能会发生我的字符串只有这样的大写字母S:

unfortunatestring=S0 S1 S5 S11 S2

脚本只停在该行    string1 = $(echo $ string | grep -o' s [^] +')

但如果我使用sh -x在调试模式下运行我的脚本,一切正常。

我假设在grep上执行命令替换而无法返回值导致脚本停止,我的问题是为什么?如果string1是空的,我不介意,但我会介意我的脚本停止。

请你给我一个解决方案,它总是用字符串创建string1和string2,如果string1和string2为空则不是问题。

我是bash的新手,我认为这也可以用sed或awk完成。

1 个答案:

答案 0 :(得分:1)

string="S1 s5 S0 s3 s2 S11 s13"
string1=$(sed 'S/[ ]*s[0-9]*[ ]*//g' <<<"$string") #removing big s
echo "$string1"
string2=$(sed 's/[ ]*S[0-9]*[ ]*//g' <<<"$string") #removing small s
echo "$string2"