我正在尝试分割路径但获得正确的命令

我正在尝试分割路径但获得正确的命令

我试图分割路径但没有得到正确的命令

ie/bin/bash/test/path/to/split和 应该被分割/切割成用 string 分隔的两部分 ie split on string /to/

预期输出:/bin/bash/test/path/split

我尝试过剪切命令选项但没有用

答案1

cut只能采用单个字符 1 分隔符。

bash变量可以这样处理:

❯ testfull="/bin/bash/test/path/to/split"
❯ testpre="${test%/to/*}"
❯ testpost="${test#*/to/}"
❯ echo "$testpre is separate from $testpost"
/bin/bash/test/path is separate from split

剥离%pattern*模式之后的所有内容以及#*pattern之前的所有内容。如果您有该模式的多个实例,则将#或加倍%可以让您选择第一个或最后一个实例。

awk可以指定一个字符串分隔符-F并选择您喜欢的任何剩余段:

❯ echo "/bin/bash/test/path/to/split" | awk -F'/to/' '{print $1" separate from "$2}'
/bin/bash/test/path separate from split

¹ 对于包括 GNU 在内的多种cut实现cut,它甚至仅限于单字节字符。

答案2

zshshell 中,您可以使用参数扩展标志在任意分隔符上拆分字符串s

$ file=$'/path/to//to/dir/and\nor/to/file'
$ parts=( "${(@s[/to/])file}" )
$ typeset parts
parts=( /path '' $'dir/and\nor' file )
$ printf ' - <%s>\n' "$parts[@]"
 - </path>
 - <>
 - <dir/and
or>
 - <file>

这里选择一个人为的示例,其中的文件路径包含多次出现的/to/两个连续的和一个换行符,以提醒您可能需要担心的潜在陷阱。

s@与引号结合起来是为了保留空元素(这里是连续出现的 之间的元素/to/)。

j您可以使用参数扩展标志将各个部分连接在一起:

$ print -r -- ${(j[/to/])parts}
/path/to//to/dir/and
or/to/file

在 bash4.4+ 中,您可以通过卸载来执行一些操作,perl例如进行拆分:

$ file=$'/path/to//to/dir/and\nor/to/file'
$ readarray -td '' parts < <(perl -l0se 'print for split /\Q$s\E/, $file, -1' -- -file="$file" -s=/to/)
$ typeset -p parts
declare -a parts=([0]="/path" [1]="" [2]=$'dir/and\nor' [3]="file")

请注意,这perl按字节而不是按字符工作。此处确定的分隔符的开头和结尾的/编码保证不会在其他字符中找到,但可能会用其他分隔符破坏中间的某些字符。

在 中zsh,另请参阅:

$ file=/bin/bash/test/path/to/split
$ print -r -- $file:h:h
/bin/bash/test/path

head 的head)

$ print -r -- $file:t
split

t艾尔)。

与 csh/tcsh 中相同。bash也支持那些:h:t 修饰语但仅限于历史扩展,不能应用于参数扩展。

相关内容