strip_slashes(){
declare -n stripped=$1
local -i i
stripped=$3
for((i=0;i<$2;i++)) ; do
stripped=${stripped#*/}
done
stripped="/$stripped"
}
Isso é invocado como
strip_slashes X 3 "/home/user/test/folder"
echo $X
O primeiro parâmetro é o nome da variável para armazenar o resultado, depois o número de barras a serem removidas e o valor do qual removê-las.
Passar o nome da variável para armazenar o resultado significa que você não precisa codificar o nome (por exemplo, REPLY como usado por select e read por padrão) nem precisa de um subshell. Após o declare -nstrippedé um alias para a variável nomeada.
soluções sed. Usando gnu sed
echo /home/user/test/folder | sed -E 's:(/[^/]*){2}::'
mais portátil
echo /home/user/test/folder | sed 's:/[^/]*/[^/]*::'
Supondo que /home/user/test/folderseja o conteúdo de alguma variável dirpathe que o diretório inicial do usuário atual, conforme fornecido por $HOME, seja /home/user, o código a seguir imprimiria Path under $HOME directory is "/test/folder".
dirpath=/home/user/test/folder
printf 'Path under $HOME directory is "%s"\n' "${dirpath#$HOME}"
Ele faz isso removendo a $HOMEstring de prefixo $dirpathpor meio de uma expansão de parâmetro padrão.
Isso pode ser generalizado para outros caminhos além daqueles em $HOME:
dirpath=/0/1/2/somewhere/output/test/folder
topdir=${dirpath%/*/*}
printf 'The path under "%s" is "%s"\n' "$topdir" "${dirpath#$topdir}"
Isso imprimiria The path under "/0/1/2/somewhere/output" is "/test/folder".
O valor para topdiré dado excluindo qualquer correspondência /*/*do final do $dirpathuso de uma substituição de parâmetro padrão. O padrão /*/*deve corresponder exatamente ao que queremos encontrar mais tarde no final de $dirpath, neste caso, os dois últimos componentes do nome do $dirpathcaminho.
Depois de encontrar $topdir, apenas repetimos os exercícios como fizemos quando esse diretório mais alto era $HOME.
Usando apenas os built-ins do bash
Isso é invocado como
O primeiro parâmetro é o nome da variável para armazenar o resultado, depois o número de barras a serem removidas e o valor do qual removê-las.
Passar o nome da variável para armazenar o resultado significa que você não precisa codificar o nome (por exemplo, REPLY como usado por select e read por padrão) nem precisa de um subshell. Após o
declare -n
stripped
é um alias para a variável nomeada.soluções sed. Usando gnu sed
mais portátil
Supondo que
/home/user/test/folder
seja o conteúdo de alguma variáveldirpath
e que o diretório inicial do usuário atual, conforme fornecido por$HOME
, seja/home/user
, o código a seguir imprimiriaPath under $HOME directory is "/test/folder"
.Ele faz isso removendo a
$HOME
string de prefixo$dirpath
por meio de uma expansão de parâmetro padrão.Isso pode ser generalizado para outros caminhos além daqueles em
$HOME
:Isso imprimiria
The path under "/0/1/2/somewhere/output" is "/test/folder"
.O valor para
topdir
é dado excluindo qualquer correspondência/*/*
do final do$dirpath
uso de uma substituição de parâmetro padrão. O padrão/*/*
deve corresponder exatamente ao que queremos encontrar mais tarde no final de$dirpath
, neste caso, os dois últimos componentes do nome do$dirpath
caminho.Depois de encontrar
$topdir
, apenas repetimos os exercícios como fizemos quando esse diretório mais alto era$HOME
.Como você conhece o delimitador, não há nada intrinsecamente errado em adicioná-lo novamente.