提取斜杠第二次和第三次出现之间的字符串

提取斜杠第二次和第三次出现之间的字符串

我有一个路径字符串“/app/dev/xyz/tools”,如何从路径字符串中提取单词“dev”。 (我希望提取第二次和第三次出现斜杠之间的子字符串)

答案1

cutman 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但仅用于历史扩展),:hand:t修饰符返回尾巴分别是一条路径。

zsh扩展它们以允许在它们后面添加一个数字,指定有多少(多少个组件)或者尾巴要选择, sp${string:h3:t}会给你尾巴3分量的中存储的路径$string

如果$string包含的组件少于 3 个,则返回最后一个。

实际上,从技术上讲,它检索第三个路径组件,不一定是第三个分隔 /字段。例如,在 中a//b/c/d,它给你cnot 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将字符串拆分为数组(并且echoprintf命令替换)如果您适当地设置了 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

如果您只需要字符串的路径元素之一,那么最好只使用cutawk提取它。如果您需要迭代每个路径元素,那么将它们放在数组中会很方便。

相关内容