경로 문자열 "/app/dev/xyz/tools"가 있습니다. 경로 문자열에서 "dev"라는 단어를 어떻게 추출할 수 있습니까? (두 번째와 세 번째 슬래시 사이의 하위 문자열을 추출하고 싶습니다)
답변1
그리고 cut
( man 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
과거 확장의 경우에만) 와 유사하게 :h
and :t
수정자는 반환합니다 .머리그리고꼬리각각은 경로입니다.
zsh
개수(구성 요소 개수)를 지정하는 뒤에 숫자를 추가할 수 있도록 확장하세요.머리또는꼬리선택하려면 sp가 ${string:h3:t}
제공합니다.꼬리3인분머리에 저장된 경로입니다 $string
.
$string
구성 요소가 3개 미만인 경우 마지막 구성 요소가 반환됩니다.
실제로 기술적으로는 세 번째 구분 기호 필드 가 아닌 세 번째 경로 구성 요소를 검색합니다 . 예를 들어, 에서는 not 을 제공합니다 . 세 번째로 구분된 필드의 경우 다음을 사용할 수 있습니다. /
a//b/c/d
c
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 셸에서 동일한 작업을 수행할 수 있습니다.
$ 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 유사 쉘)에서는 bash
or (및 배열을 사용하여 문자열을 배열로 분할 할 수 있습니다.echo
printf
명령 대체) 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 배열 인덱싱은 1이 아닌 0에서 시작됩니다. 이 경우 /
의 첫 번째 요소 앞에는 아무것도 없기 때문에 0번째 요소는 비어 있습니다 $str
.
문자열의 경로 요소 중 하나만 필요한 경우 해당 요소를 사용 cut
하거나 awk
추출하는 것이 좋습니다. 각 경로 요소를 반복해야 하는 경우 이를 배열에 넣는 것이 편리합니다.