shell脚本中的substring before和substring

时间:2014-03-04 15:42:50

标签: unix ksh

我有一个字符串:

//host:/dir1/dir2/dir3/file_name

我想获取host&的价值unix脚本中不同变量的目录。 示例:

host_name = host
dir_path = /dir1/dir2/dir3

注意 - 字符串长度&没有目录没有修复。

请你帮我从unix shell脚本中的字符串中获取这些值。

3 个答案:

答案 0 :(得分:3)

我会用正则表达式来做:

if [[ $path =~ ^//(.*):(.*)/(.*)$ ]]; then
    host="${BASH_REMATCH[1]}"
    dir_path="${BASH_REMATCH[2]}"
    filename="${BASH_REMATCH[3]}"
else
    echo "Invalid format" >&2
    exit 1
fi

如果您确定格式匹配,则可以执行

[[ $path =~ ^//(.*):(.*)/(.*)$ ]]
host="${BASH_REMATCH[1]}"
dir_path="${BASH_REMATCH[2]}"
filename="${BASH_REMATCH[3]}"

编辑:由于您似乎使用的是ksh而不是bash(虽然问题中指出了bash),但语法略有不同:

match=(${path/~(E)^\/\/(.*):(.*)\/(.*)$/\1 \2 \3})
host="${match[0]}"
dir_path="${match[1]}"
filename="${match[2]}"

但是,如果文件名中有空格,则会中断。在这种情况下,您可以使用更麻烦的

host="${path/~(E)^\/\/(.*):(.*)\/(.*)$/\1}"
dir_path="${path/~(E)^\/\/(.*):(.*)\/(.*)$/\2}"
filename="${path/~(E)^\/\/(.*):(.*)\/(.*)$/\3}"

也许在ksh中有更优雅的方式,但我不熟悉它。

答案 1 :(得分:3)

使用bash字符串操作:

str='//host:/dir1/dir2/dir3/file_name'
host_name=${str%%:*}
host_name=${host_name##*/}
dir_path=${str#*:}
dir_path=${dir_path%/*}

答案 2 :(得分:0)

我能想到的最短路径是在一个语句中分配两个变量:

$ read host_name dir_path <<< $(echo $string | sed -e 's,^//,,;s,:, ,')

完整的脚本:

string="//host:/dir1/dir2/dir3/file_name"
read host_name dir_path <<< $(echo $string | sed -e 's,^//,,;s,:, ,')
echo "host_name = " $host_name
echo "dir_path = " $dir_path

输出:

host_name:  host
dir_path:  /dir1/dir2/dir3/file_name