ご挨拶!
これはよく知られている Bash パラメーター展開パターンです。
${parameter#word} , ${parameter##word}
と
${parameter%word} , ${parameter%%word}
パラメータの最初の部分と末尾の別の部分を切り取る必要があります。何かアドバイスをお願いできますか?
ご挨拶!
これはよく知られている Bash パラメーター展開パターンです。
${parameter#word} , ${parameter##word}
と
${parameter%word} , ${parameter%%word}
パラメータの最初の部分と末尾の別の部分を切り取る必要があります。何かアドバイスをお願いできますか?
Bash バージョン >= 3.2 を使用している場合は、キャプチャ グループとの正規表現マッチングを使用して、1 つのコマンドで値を取得できます。
$ path='/xxx/yyy/zzz/ABC/abc.txt'
$ [[ $path =~ ^.*/([^/]*)/.*$ ]]
$ echo ${BASH_REMATCH[1]}
ABC
これは次と同等です。
$ path='/xxx/yyy/zzz/ABC/abc.txt'
$ path=$(echo "$path" | sed 's|^.*/\([^/]*\)/.*$|\1|p')
$ echo $path
ABC
このソリューションは、Andrey が求めたものを使用し、外部ツールは使用しません。戦略: % パラメータ展開を使用してファイル名を削除してから、## を使用して最後のディレクトリ以外をすべて削除します。
$ path=/path/to/my/last_dir/filename.txt
$ dir=${path%/*}
$ echo $dir
/path/to/my/last_dir
$ dir=${dir##*/}
$ echo $dir
last_dir
パフォーマンスが正規表現マッチングよりも 3 倍以上速いため、bash 配列を使用することを強くお勧めします。
$ path='/xxx/yyy/zzz/ABC/abc.txt'
$ IFS='/' arr=( $path )
$ echo ${arr[${#arr[@]}-2]}
ABC
これは、配列の各要素がスラッシュで区切られていることを bash に伝えることで機能し/
ますIFS='/'
。配列の最後から 2 番目の要素にアクセスするには、最初に配列内の要素数を決定し、${#arr[@]}
次に 2 を減算して、それを配列のインデックスとして使用します。
サブシェルに頼らずにこれを行う簡単な方法があるかどうかはわかりませんが、おそらく効率のために避けたいものです。私はただ使用します:
> xx=hello_there
> yy=${xx#he}
> zz=${yy%re}
> echo ${zz}
llo_the
効率にこだわらず、ワンライナーが必要な場合:
> zz=$(echo ${xx%re} | sed 's/^he//')
> echo ${zz}
llo_the
この 2 番目の方法はサブシェルを開始することに注意してください。スクリプトを高速に実行する必要がある場合、これは私が頻繁に行うことではありません。