2番目と3番目のスラッシュ発生の間の文字列を抽出します。

2番目と3番目のスラッシュ発生の間の文字列を抽出します。

パス文字列 "/app/dev/xyz/tools"があります。パス文字列から「dev」という単語をどのように抽出できますか? (2番目と3番目のスラッシュの間の部分文字列を抽出したい)

答え1

そしてcutman 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つ未満の場合、最後のコンポーネントが返されます。

実際、技術的には、3番目の区切り文字フィールドではなく3番目のパスコンポーネントを検索します。たとえば、ではnotを提供します。 3番目に区切られたフィールドには、次のものを使用できます。 /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

文字列のパス要素の1つだけが必要な場合は、その要素を使用または抽出cutすることawkをお勧めします。各パス要素を繰り返す必要がある場合は、配列に配置するのが便利です。

関連情報