我试图分割路径但没有得到正确的命令
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
在zsh
shell 中,您可以使用参数扩展标志在任意分隔符上拆分字符串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
(h
ead 的h
ead)
$ print -r -- $file:t
split
(t
艾尔)。
与 csh/tcsh 中相同。bash
也支持那些:h
,:t
修饰语但仅限于历史扩展,不能应用于参数扩展。