Busca / substituição recursiva, levando em consideração a profundidade do diretório

3

Eu tive boa sorte em encontrar / substituir básico:

find . -name "*.php" -exec sed -i -e "s/<?php include 'http:\/\/www/<?php include '..\//g" \{\} \;

Eu estou querendo saber se existe uma maneira de alcançar um resultado semelhante, mas levando em conta a 'profundidade' do diretório atual, e colocando um ../ adicional na string de substituição para cada nível abaixo, estamos na estrutura ?

    
por Roland Snowe 26.10.2015 / 21:48

1 resposta

2

Você pode tentar algo assim:

find . -name '*.php' -exec sh -c \
'PREFIX=${1//[!/]/}; PREFIX=${PREFIX//\//..\/}; ...' sh {} \;

Isso definirá PREFIX para ../ quando o arquivo encontrado for dir/filename . Em seguida, você pode inserir o comando sed na posição ... , fazendo uso da variável $PREFIX da shell.

Isso requer um shell que tenha a expansão ${var//find/repl} . Isso não é especificado por POSIX, mas Bash e algumas implementações de ash o possuem. Se o seu não, você teria que usar outra coisa para fazer a manipulação do prefixo. Nesse caso, eu usaria um único processo awk para fazer a manipulação do prefixo em sua cláusula BEGIN , então a substituição em cada linha do arquivo (em vez de um processo sed separado).

    
por 26.10.2015 / 22:17