Com o bash e um regex:
s="/dir0/dir1/dir2/filename.ext"
[[ $s =~ ([^/]*)/[^/]*$ ]] && echo "${BASH_REMATCH[1]}"
Saída:
dir2
Estou usando o Bash. Eu tenho uma string de caminhos, como /dir0/dir1/dir2/filename.ext
e eu quero extrair a string dir2
no bash.
Você pode assumir que a palavra que eu quero extrair está localizada entre os dois últimos caracteres /
.
Estou tentando combinar ##
e %
, mas com resultados ruins.
O que eu tentei e não funciona é cut=${${path%/*}##*/}
.
Como posso fazer isso?
Resolvido mas procurando alternativas . Minha solução é a seguinte:
cut=$(tmp=${path%/*}; echo ${tmp##*/})
Outra maneira com o Bash (também dois passos).
IFS=/ read -a array <<<'/dir0/dir1/dir2/filename.ext'
echo ${array[ $(( ${#array[@]}-2 )) ]}
dir2
Você precisa fazer a análise em etapas: -
path=/dir0/dir1/dir2/filename.ext
dir=${path%/*}
lastdir=${dir##*/}
Ao tentar combinar as duas operações de análise, você estava tentando usar uma string em vez de uma variável na segunda expansão: isso não é suportado.
Observe que você pode usar o mesmo nome de variável para dir
e lastdir
, por exemplo: -
cut=${path%/*}; cut=${cut##*/}
Você não disse que o seu shell é bash
, mas eu assumi isso do seu exemplo de código.
Resolveu usando o awk:
echo "/dir0/dir1/dir2/filename.ext" | awk -F'/' '{print $(NF-1)}'
A saída acima será:
dir2
Tags bash shell string-manipulation