シェルスクリプトからパスの特定の部分を抽出する方法は?

シェルスクリプトからパスの特定の部分を抽出する方法は?

path変数があります/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1/usr/apps/app1/home/usera/run/10/_tmpシェルスクリプトから抽出する方法は?

答え1

シェルを使うパラメータ拡張:

dir=/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1
echo "${dir%/*/*}"

/usr/apps/app1/home/usera/run/10/_tmp

パラメータ拡張拡張パラメータ:$foo、、$1。これを使用して文字列または配列操作を実行できます"${file%.mp3}"。彼らは"${0##*/}""${files[@]: -4}"いつも引用してください。

望むより:http://mywiki.wooledge.org/BashFAQ/073そして
LESS='+/Parameter Expansion' man bash
また参照http://wiki.bash-hackers.org/syntax/pe

答え2

zsh シェルで、次の操作を行います。

dir=/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1
到着
newdir=/usr/apps/app1/home/usera/run/10/_tmp

最後に2つのパスコンポーネントを削除する場合:

newdir=$dir:h:h

cshと同様に、パスのh先頭を取得するために履歴を使用します。h:h修飾子これはパラメータ拡張に適用されます。

パスの最初の9つのコンポーネントをインポートするには、次の手順を実行します。

newdir=${dir:h9}

一番左の項目にすべてを追加する場合/_tmp:

newdir=${(M)dir#*/_tmp}

一番右の場合:

newdir=${(M)dir##*/_tmp}

${var#pattern}マッチングを開始すると、それぞれが${var##pattern}最短文字列と最長文字列の値に展開される Korn シェルの演算子です。とともに$varpatternM パラメータ拡張フラグ、取り外す代わりにM取り付けられた部分まで延びます。


csh1 は zsh が提供するものと同じように動作しますが、csh はdir=/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1/ksh と同様に、対応する末尾の s を追加のパスコンポーネントとして扱います。dir=/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1///${dir%/*/*}

答え3

使用dirname:

dir=/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1
dirname -- "$(dirname -- "$dir")"

/usr/apps/app1/home/usera/run/10/_tmp

答え4

パス変数に改行(\ n)がないと仮定すると、sedを使用してこれを実行できます。

$ A=/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1
$ cutoff=/folder1/folder
$ echo "$A" | sed "s#$cutoff##"
/usr/apps/app1/home/usera/run/10/_tmp1

(文字列にスラッシュが含まれているため、sedで別の区切り文字を使用する必要があります。カットオフ変数に存在しない区切り文字を選択してください)

関連情報