パス文字列 "/app/dev/xyz/tools"があります。パス文字列から「dev」という単語をどのように抽出できますか? (2番目と3番目のスラッシュの間の部分文字列を抽出したい)
答え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つ未満の場合、最後のコンポーネントが返されます。
実際、技術的には、3番目の区切り文字フィールドではなく3番目のパスコンポーネントを検索します。たとえば、ではnotを提供します。 3番目に区切られたフィールドには、次のものを使用できます。 /
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
。
文字列のパス要素の1つだけが必要な場合は、その要素を使用または抽出cut
することawk
をお勧めします。各パス要素を繰り返す必要がある場合は、配列に配置するのが便利です。