我有一个字符串:
//host:/dir1/dir2/dir3/file_name
我想获取host&的价值unix脚本中不同变量的目录。 示例:
host_name = host
dir_path = /dir1/dir2/dir3
注意 - 字符串长度&没有目录没有修复。
请你帮我从unix shell脚本中的字符串中获取这些值。
答案 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