在bash中提取字符串的两个第一个单词

时间:2016-01-14 20:20:36

标签: string bash extract

我有一个带有句子的字符串 a="hello my dear friend"。我想要检索前两个单词(这里应该是"你好我的"),知道单词的数量可以变化。我试过了${a%% *},但它只给了我第一个。

在同一种类型中,我需要在没有两个第一个单词的情况下提取整个句子。我怎么能这样做?

4 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分:1)

您可以使用正则表达式捕获所需文本的部分:

$ 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?

答案 2 :(得分:0)

您可以将字符串读入数组并使用切片:

public void someQuery() {
    try
    {

// Insert Statement with ? Placeholders
Connection conn = connectDB();
...

以其他流程为代价,您也可以使用$ read -ra words <<<"$a" && echo "${words[@]:2}" dear friend

cut

这种行为略有不同,因为它在单个空格上分裂,而使用read的方法将消耗每个单词之间的任意数量的空格。

答案 3 :(得分:0)

Shell函数适用于任何Bourne shell或更高版本:

$ f2 () { echo "$1" "$2" }
$ frest () { shift; shift; echo "$*" }

$ a="hello my dear friend"

$ f2 $a
hello my

$ frest $a
dear friend