Remova barras / caminhos pai de nomes de arquivos dentro de conteúdo CSS e Javascript

3

Eu preciso percorrer todos os meus arquivos css e js e se houver um nome de arquivo referenciado que tenha alguma barra ( / ), então a barra deve ser removida.

O que eu quero é:

  • se algum arquivo referenciado tiver o nome /file.jpg , remova a barra inicial deixando apenas file.jpg .

    Por exemplo, em uma alteração no arquivo CSS:

    @import url("/base.css"); to @import url("base.css");

  • se o arquivo referenciado tiver o nome /files/file.jpg , as barras e o nome da pasta deverão ser removidos, deixando apenas file.jpg .

Eu comecei a escrever, mas depois não consegui pensar em como lidar com as barras.

grep -o -h -E '[A-Za-z0-9:./_-]+\.(png|jpg|gif|tif|css)' 'find
${new_directory} -name '*.css' -or -name '*.js''

Alguma ideia de como fazer isso? Eu estou fazendo isso usando um script shell .sh .

    
por jimmij 12.07.2011 / 15:42

2 respostas

1

Não analise a saída de find dessa maneira. Ele funcionará se seus arquivos não contiverem caracteres especiais, mas para invocar um comando nos arquivos encontrados por find , é mais fácil e mais robusto fazer com que find chame o comando:

find "$new_directory" -name '*.css' -o -name '*.js' -exec grep … {} +

Então grep não é a ferramenta certa para realizar uma substituição de texto; é apenas uma ferramenta de pesquisa. sed é um editor de fluxo e seu recurso mais usado é a substituição de expressões regulares. Assumindo que o GNU sed (como encontrado no Linux), e supondo que o seu regexp é basicamente correto, ou seja, que você deseja corresponder todas as seqüências de letra-ou-dígito-ou-co_de% seguido por uma extensão provável como nomes de arquivo , eis uma chamada :._- para substituir sed por DIR1/DIR2/FILE.EXT em todos os lugares:

sed -e 's![/A-Za-z0-9:._-]*/\([A-Za-z0-9:._-]*\.\(png\|jpg\|gif\|tif\|css\)\)!!g'

Colocando as duas partes juntas, se você quiser fazer as substituições no lugar, a maneira mais fácil é usar a opção FILE.EXT do GNU sed, que faz exatamente isso.

find "$directory" -name '*.css' -o -name '*.js' \
     -exec sed -e 's![/A-Za-z0-9:._-]*/\([A-Za-z0-9:._-]*\.\(png\|jpg\|gif\|tif\|css\)\)!!g' {} +

Se você quiser colocar as substituições em um lugar diferente, você precisará de um pouco de cola intermediária para construir os nomes dos novos arquivos.

find "$old_directory" -name '*.css' -o -name '*.js' \
     -exec sh -c 'sed -e '\''s![/A-Za-z0-9:._-]*/\([A-Za-z0-9:._-]*\.\(png\|jpg\|gif\|tif\|css\)\)!!g'\' <"$0" >"/new/directory/$0"' {} \;

Observe o uso de -i para colocar uma aspa simples dentro do fragmento de shell de aspas simples. '\'' significa executar o comando uma vez em cada arquivo, em contraste com -exec … {} \; , que executa o comando em tantos arquivos em um lote quanto possível.

    
por 12.07.2011 / 23:21
0

Use o basename incorporado. Funciona assim:

$ basename "/abc/def/ghi.jkl"
ghi.jkl
    
por 12.07.2011 / 15:45