【发布时间】:2016-04-20 07:58:39
【问题描述】:
我有一个字符串,里面有一个句子 like
a="hello my dear friend"。我想检索前两个单词(这里应该是“hello my”),知道单词的数量可能会有所不同。我试过${a%% *},但它只给了我第一个。
在同一种情况下,我需要提取没有前两个单词的整个句子。我该怎么做?
【问题讨论】:
我有一个字符串,里面有一个句子 like
a="hello my dear friend"。我想检索前两个单词(这里应该是“hello my”),知道单词的数量可能会有所不同。我试过${a%% *},但它只给了我第一个。
在同一种情况下,我需要提取没有前两个单词的整个句子。我该怎么做?
【问题讨论】:
您可以使用正则表达式来捕获您想要的文本部分:
$ a="hello my dear friend"
$ [[ $a =~ ^([^ ]+ [^ ]+)\ ?(.*) ]]
$ echo "${BASH_REMATCH[1]}"
hello my
$ echo "${BASH_REMATCH[2]}"
dear friend
Bash 的 extglob 功能也可以使用,使用匹配的表达式作为排除项:
$ shopt -s extglob
$ a="hello my dear friend. would you like a beer?"
$ b="${a#+(!( )) +(!( )) }"
$ echo "$b"
dear friend. would you like a beer?
$ echo "${a%$b}"
hello my
或者从字符串的另一端:
$ c="${a% +(!( )) +(!( ))}"
$ echo "$c"
hello my dear friend. would you like
$ echo "${a#$c}"
a beer?
【讨论】:
Shell 函数在任何 Bourne shell 或更高版本中都适用于此:
$ f2 () { echo "$1" "$2" }
$ frest () { shift; shift; echo "$*" }
$ a="hello my dear friend"
$ f2 $a
hello my
$ frest $a
dear friend
【讨论】:
您可以将字符串读入数组并使用切片:
$ read -ra words <<<"$a" && echo "${words[@]:2}"
dear friend
以另一个进程为代价,你也可以使用cut:
$ cut -d' ' -f3- <<<"$a"
dear friend
这种行为略有不同,因为它在单个空格上拆分,而使用 read 的方法将占用每个单词之间的任意数量的空格。
【讨论】:
您可以为此使用 BASH 数组:
# construct an array delimited by whitespace
a="hello my dear friend"
arr=($a)
# first two words
echo "${arr[@]:0:2}"
hello my
# anything after first 2 words
echo "${arr[@]:2}"
dear friend
【讨论】: