在具有多个空格的变量上进行Bash参数扩展

时间:2018-09-13 13:59:40

标签: bash

我们假设以下变量:

something="    abc   def      ghi"

我正在尝试使用参数扩展,仅保留abc。我尝试了10种有意义的组合,还随机尝试了20种组合。我得到的最接近的是:

echo ${something% *}
abc def

这可能解决吗?如果是这样,怎么办?谢谢。

4 个答案:

答案 0 :(得分:3)

一次bash扩展将非常困难。您可能对此感兴趣:

$ a="    abc   def      ghi"
$ [[ "${a}" =~ ([^\ ][^\ ]*) ]]
$ echo "${BASH_REMATCH[0]}"

这实际上会搜索字符串中的所有单词,并将它们存储在数组BASH_REMATCH中。 man bash部分[[ expression ]]中的更多信息。

您还可以将事物转换为数组:

$ a="    abc   def      ghi"
$ b=( $a )
$ echo "${b[0]}"

或者您可以使用read

$ a="    abc   def      ghi"
$ read -r b dummy <<< "${a}"
$ echo "${b}"

但是,如果您真的想使用参数扩展,并且允许使用extglob并且不知道字符串中的单词数,则可以这样做

$ a="    abc   def      ghi"
$ shopt -s extglob
$ a=${a##*([ ])}   #remove the spaces in the front
$ a=${a%% *}       #remove everything from the first space onwards
$ echo "${a}"

答案 1 :(得分:2)

如果这只是您想要的第一个以空格分隔的单词,请使用read

read x _ <<< "${something}"

read"${something}"的值,并根据IFS的当前值将其分为两个单词;第一个单词(abc)分配给x,第二个单词(由所有剩余字符组成)分配给一次性变量_

答案 2 :(得分:1)

您不能在单个参数扩展中执行此操作,而是执行以下操作:

$ x=${something% def*}
$ echo ${x# *}
abc

答案 3 :(得分:1)

使用extglob

shopt -s extglob
echo ${something%%*( )*([^ ])*( )*([^ ])}

尽管替换本身并不能消除前导空格,但是shell单词拆分可以做到这一点。如果您引用要回显的参数,它们将仍然存在。

该替换会删除零个或多个空格的最长匹配项,然后删除零个或多个非空格字符,然后在字符串末尾再次零个或多个空格以及零个或多个非空格字符。