给定字符串"foo-bar-1.4.5"
或"for-bar-baz-1.8.3"
如何将这些字符串分成两部分:第一部分是最后一部分之前的所有内容“ - ”("foo-bar"
,"foo-bar-baz"
)和最后一部分("1.4.5"
和"1.8.3"
)分别?
我可以想象一些策略,比如拆分“ - ”然后添加除最后一部分之外的所有内容。或者也许是替代的正则表达式。尽管如此,Bash是我最重要的事情。我不确定语法是什么样的,我已经用sed
和awk
尝试了一些东西但是我对bash数组的不满让我感到很不舒服。我认为你们中的一位bash专家可以在短时间内解决这个问题并通过一个非常快的例子教我。
编辑:在命令运行之前我不知道“ - ”的数量。该方法应处理“ - ”的n >= 1
。
答案 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