我们假设以下变量:
something=" abc def ghi"
我正在尝试使用参数扩展,仅保留abc
。我尝试了10种有意义的组合,还随机尝试了20种组合。我得到的最接近的是:
echo ${something% *}
abc def
这可能解决吗?如果是这样,怎么办?谢谢。
答案 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单词拆分可以做到这一点。如果您引用要回显的参数,它们将仍然存在。
该替换会删除零个或多个空格的最长匹配项,然后删除零个或多个非空格字符,然后在字符串末尾再次零个或多个空格以及零个或多个非空格字符。