Como extrair os dois últimos diretórios (ou qualquer número) de um caminho com sed?

1

Estou realmente procurando uma solução genérica aqui, mas, por exemplo, digamos que eu esteja procurando os diretórios 2 mais profundos em um caminho. exemplo: dado um caminho /home/someone/foo/bar , como posso usar sed (ou awk) para obter foo/bar

Seria simples se a primeira parte do caminho fosse sempre a mesma, mas, no meu caso, estou procurando uma expressão que funcione para qualquer caminho arbitrário e, idealmente, para qualquer profundidade n .

Se o caminho tiver menos de n (neste caso, 2) níveis, não é importante como o comando se comporta.

Eu fui fazer isso hoje e achei complicado. Comecei a escrever um loop para fazer isso em vez disso, mas não posso abalar a sensação de que isso deve ser possível em um único comando. Eu poderia estar errado. Alguma idéia?

    
por steve c c 20.10.2017 / 19:31

2 respostas

2
echo "/your/directory/here/bla" | awk -F"/" '{ print "/"$(NF-1)"/"$NF }'

deve funcionar com um achado, não tentei, mas algo assim deveria estar funcionando:

find /yourfolder/structure -type d | awk -F"/" '{ print "/"$(NF-1)"/"$NF }'

FYI, $ NF é o campo mais recente encontrado no awk, $ (NF-1), o anterior.

    
por 20.10.2017 / 21:41
1

No awk, altere seu separador de campo para slash:

$ echo /home/someone/foo/bar | awk -F / -v OFS=/ '{ print $(NF-1), $NF }'
foo/bar

Define o separador do campo de entrada e o separador do campo de saída para cortar e depois imprime o valor do segundo ao último campo, o separador do campo e, em seguida, o último valor do campo.

solução de valor n

$ echo /home/someone/foo/bar | awk -F / -v n=3 '
    { o = $NF; for (f=1; f<n; f++) o = $(NF-f) "/" o; print o }
  '
someone/foo/bar

Isso usa um loop para extrair o número desejado de diretórios.

    
por 20.10.2017 / 21:42

Tags