如何在Linux Bash / Shell中将字符串拆分为组件部分

时间:2015-07-03 10:51:28

标签: bash shell

我正在编写我的post-receive git hook的第二个版本。

我有一个GL_REPO变量符合:

/project.name/vhost-type/versioncodename

它可能有也可能没有尾随和/或前面的斜线。

我当前的代码误解了以下代码的功能,因此它清楚地将$versioncodename复制到每个变量中:

# regex out project codename
PROJECT_NAME=${GL_REPO##*/}
echo "project codename is: $PROJECT_NAME"

# extract server target vhost-type -fix required
VHOST_TYPE=${GL_REPO##*/}
echo "server target is: $VHOST_TYPE"

# get server project - fix required
PROJECT_CODENAME=${GL_REPO##*/}
echo "server project is: $PROJECT_CODENAME"

从字符串后面一次一个地获取这些元素,或者保证三部分字符串分配这些变量的正确方法是什么?

我想分成一个数组可能会更好吗?

3 个答案:

答案 0 :(得分:7)

#!/bin/bash

GL_REPO=/project.name/vhost-type/versioncodename
GL_REPO=${GL_REPO#/} # remove preceding slash, if any

IFS=/ read -a arr <<< "$GL_REPO"

PROJECT_NAME="${arr[0]}"
VHOST_TYPE="${arr[1]}"
PROJECT_CODENAME="${arr[2]}"

更新:anishsane的替代解决方案:

IFS=/ read PROJECT_NAME VHOST_TYPE PROJECT_CODENAME <<< "$GL_REPO"

答案 1 :(得分:2)

您可以将cut与字段分隔符一起使用,按顺序提取项目:

NAME=$(echo $GL_REPO | cut -d / -f 1)

您可以对其他字段重复相同的操作。您可以忽略的尾随/前导斜杠(例如,您将使NAME字段为空)或者您可以使用${GL_REPO##/}去除前导斜杠(类似地,您可以使用{去掉尾随斜杠) {1}})。

答案 2 :(得分:1)

这是另一种方式:

GL_REPO="/project.name/vhost-type/versioncodename"
GL_REPO="${GL_REPO/#\//}" 
#^replace preceding slash (if any) with empty string.
IFS="/" arr=($GL_REPO)
echo "PN: ${arr[0]} VHT: ${arr[1]} VC: ${arr[2]}"

使用Bash Pattern Matching

GL_REPO="/project.name/vhost-type/versioncodename"
patt="([^/]+)/([^/]+)/([^/]+)"
[[ $GL_REPO =~ $patt ]]
echo "PN: ${BASH_REMATCH[1]} VHT: ${BASH_REMATCH[2]} VC: ${BASH_REMATCH[3]}"