我有一个带有句子的字符串
a="hello my dear friend"
。我想要检索前两个单词(这里应该是"你好我的"),知道单词的数量可以变化。我试过了${a%% *}
,但它只给了我第一个。
在同一种类型中,我需要在没有两个第一个单词的情况下提取整个句子。我怎么能这样做?
答案 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