【问题标题】:Why grep fails within the script and not in the command line为什么 grep 在脚本中而不是在命令行中失败
【发布时间】: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 导致脚本在你的设置中挂起吗?

标签: bash shell awk sed grep


【解决方案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"

【讨论】:

  • 知道 grep 失败的原因吗?
  • @AleksandarDemić 我已经更新了我的 sed 脚本。不知道为什么 grep 失败了。它对我有用
猜你喜欢
  • 2016-09-29
  • 2013-09-28
  • 2014-02-18
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2019-05-28
  • 2021-12-29
  • 2021-10-23
相关资源
最近更新 更多