경로를 분할하려고 하는데 올바른 명령을 받고 있습니다.

경로를 분할하려고 하는데 올바른 명령을 받고 있습니다.

경로를 분할하려고 했지만 올바른 명령을 받지 못했습니다.

즉, /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

perlbash4.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 수정자그러나 이는 역사적 확장에만 국한되며 매개변수 확장에는 적용할 수 없습니다.

관련 정보