我有一个路径字符串“/app/dev/xyz/tools”,如何从路径字符串中提取单词“dev”。 (我希望提取第二次和第三次出现斜杠之间的子字符串)
答案1
和cut
(man cut
)。
echo "/app/dev/xyz/tools" | \
cut -d/ -f3
答案2
带壳zsh
:
$ string=/app/dev/xyz/tools
$ third_component=${string:h3:t}
$ print -r - $third_component
dev
与csh
, or类似vim
(或bash
但仅用于历史扩展),:h
and:t
修饰符返回头和尾巴分别是一条路径。
zsh
扩展它们以允许在它们后面添加一个数字,指定有多少(多少个组件)头或者尾巴要选择, sp${string:h3:t}
会给你尾巴3分量的头中存储的路径$string
。
如果$string
包含的组件少于 3 个,则返回最后一个。
实际上,从技术上讲,它检索第三个路径组件,不一定是第三个分隔 /
字段。例如,在 中a//b/c/d
,它给你c
not b
。对于第三个分隔 /
字段,您可以使用:
$ string=a//b/c/d
$ () { third_field=$3; } "${(@s[/])string}"
$ third_component=${string:h3:t}
$ print -r - $third_field $third_component
b c
您可以使用 split+glob 运算符在 POSIX shell 中执行相同的操作:
$ string=a//b/c/d
$ set -o noglob
$ IFS=/
$ set -- $string""
$ third_field=$3
$ printf '%s\n' "$third_field"
b
答案3
echo "/app/dev/xyz/tools" | awk -F/ '{print $3}'
答案4
在(以及其他支持数组的现代类似 Bourne 的 shell)中,您可以仅使用orbash
将字符串拆分为数组(并且echo
printf
命令替换)如果您适当地设置了 IFS 变量。例如
$ str="/app/dev/xyz/tools"
$ OLDIFS="$IFS"; IFS=/; array=( $(echo "$str") ); IFS="$OLDIFS"
$ declare -p array
declare -a array=([0]="" [1]="app" [2]="dev" [3]="xyz" [4]="tools")
$ echo "${array[2]}"
dev
请注意,bash 数组索引从零开始,而不是从一开始。在这种情况下,第零个元素为空,因为/
中的第一个元素之前没有任何内容$str
。
如果您只需要字符串的路径元素之一,那么最好只使用cut
或awk
提取它。如果您需要迭代每个路径元素,那么将它们放在数组中会很方便。