如何在bash的最后一个“ - ”上拆分字符串?

时间:2014-05-02 15:38:19

标签: bash split

给定字符串"foo-bar-1.4.5""for-bar-baz-1.8.3"如何将这些字符串分成两部分:第一部分是最后一部分之前的所有内容“ - ”("foo-bar""foo-bar-baz")和最后一部分("1.4.5""1.8.3")分别?

我可以想象一些策略,比如拆分“ - ”然后添加除最后一部分之外的所有内容。或者也许是替代的正则表达式。尽管如此,Bash是我最重要的事情。我不确定语法是什么样的,我已经用sedawk尝试了一些东西但是我对bash数组的不满让我感到很不舒服。我认为你们中的一位bash专家可以在短时间内解决这个问题并通过一个非常快的例子教我。

编辑:在命令运行之前我不知道“ - ”的数量。该方法应处理“ - ”的n >= 1

3 个答案:

答案 0 :(得分:6)

您可以使用parameter expansion

${var#pattern}从var的开头删除最短的匹配模式。使用##删除最长匹配模式。 %和%%的工作方式相似,但从var。

的末尾删除
#!/bin/bash
first="foo-bar-1.4.5"
second="foo-bar-baz-1.8.3"

echo ${first%-*}
echo ${first##*-}

echo ${second%-*}
echo ${second##*-}

输出:

foo-bar
1.4.5
foo-bar-baz
1.8.3

答案 1 :(得分:2)

bash中使用正则表达式:

s="foo-bar-1.4.5"
[[ $s =~ (.*)-(.*) ]]
name=${BASH_REMATCH[1]}
version=${BASH_REMATCH[2]}

bash仅使用贪婪匹配,因此第一个.*将尽可能匹配,只留下最后一个-与正则表达式中的文字-匹配

答案 2 :(得分:1)

使用bash内置功能是正确的方法。但是,作为参考,以下是使用awk

的选项
$ cat file
foo-bar-1.4.5
for-bar-baz-1.8.3

$ awk 'BEGIN{FS=OFS="-"}{last = $NF; NF--; printf "First = %s\nLast = %s\n", $0, last}' file
First = foo-bar
Last = 1.4.5
First = for-bar-baz
Last = 1.8.3