두 번째와 세 번째 슬래시 발생 사이의 문자열을 추출합니다.

두 번째와 세 번째 슬래시 발생 사이의 문자열을 추출합니다.

경로 문자열 "/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과거 확장의 경우에만) 와 유사하게 :hand :t수정자는 반환합니다 .머리그리고꼬리각각은 경로입니다.

zsh개수(구성 요소 개수)를 지정하는 뒤에 숫자를 추가할 수 있도록 확장하세요.머리또는꼬리선택하려면 sp가 ${string:h3:t}제공합니다.꼬리3인분머리에 저장된 경로입니다 $string.

$string구성 요소가 3개 미만인 경우 마지막 구성 요소가 반환됩니다.

실제로 기술적으로는 세 번째 구분 기호 필드 가 아닌 세 번째 경로 구성 요소를 검색합니다 . 예를 들어, 에서는 not 을 제공합니다 . 세 번째로 구분된 필드의 경우 다음을 사용할 수 있습니다. /a//b/c/dcb /

$ 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 유사 쉘)에서는 bashor (및 배열을 사용하여 문자열을 배열로 분할 할 수 있습니다.echoprintf명령 대체) 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추출하는 것이 좋습니다. 각 경로 요소를 반복해야 하는 경우 이를 배열에 넣는 것이 편리합니다.

관련 정보