경로를 분할하려고 했지만 올바른 명령을 받지 못했습니다.
즉, /bin/bash/test/path/to/split
문자열로 구분된 두 부분으로 분할/절단해야 합니다 /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
셸 에서는 매개변수 확장 플래그를 사용하여 모든 구분 기호에서 문자열을 분할할 수 있습니다 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
perl
bash4.4+에서는 다음을 제거하여 분할과 같은 일부 작업을 수행할 수 있습니다 .
$ 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
의 에드 h
)
$ print -r -- $file:t
split
( t
알).
csh/tcsh와 동일합니다. bash
또한 이를 지원합니다 :h
.:t
수정자그러나 이는 역사적 확장에만 국한되며 매개변수 확장에는 적용할 수 없습니다.