Problema usando o sed para substituir URLs em arquivos html com script

2

Eu tenho um script que eu escrevi que deveria substituir as URLs referenciadas em todos os arquivos em um diretório com um endereço local, e não parece estar funcionando, e eu estou querendo saber se alguém pode me fornecer algumas dicas e diga-me o que estou fazendo errado.

Meu script é o seguinte:

#!/bin/bash
#script to replace OLDSTR with NEWSTR in all files in the directory the script is run from
OLDSTR="http://some.external.url/path/to/file"
NEWSTR="file:///local/path/to/file"

( shopt -s globstar dotglob;
    for file in **; do
        if [[ -f $file ]] && [[ -w $file ]]; then
            if [ $file != ".fix" ]; then
                echo "sed -i -- 's#$OLDSTR#$NEWSTR#g' "$file""
                sed -i -- 's#$OLDSTR#$NEWSTR#g' "$file"
            else
                echo "Skipped self"
            fi
        fi
    done
)

Como estou trabalhando com URLs e caminhos unix nativos, optei por usar # como o delimitador de sed em vez de / , como é frequentemente usado nas respostas a outras perguntas relacionadas com sed .

O loop ecoa cada arquivo analisado, corresponde corretamente ao próprio script e o ignora, mas nenhum arquivo é realmente alterado. Eu tenho brincado com isso há vários dias e estou realmente irritado!

    
por Seann 24.08.2016 / 18:19

2 respostas

3

Como mencionado por steeldriver, as aspas simples suprimem todas as expansões de shell, então $OLDSTR é passado literalmente para sed . Como isso não ocorre nos arquivos, não corresponde a nada, então nada é feito. Você pode passar variáveis para sed usando aspas duplas:

 sed -i -- "s#$OLDSTR#$NEWSTR#g" "$file"

mas talvez em geral é mais seguro ativar e desativar as citações strongs e aspas duplas como normalmente faria

 sed -i -- 's#'"$OLDSTR"'#'"$NEWSTR"'#g' "$file"
    
por Zanna 20.11.2016 / 12:26
1

Bem, eu desisti de mexer com sed depois que descobri o Regexxer , que era exatamente o que eu precisava. sed tem seus usos, sem dúvida, mas o Regexxer era muito mais simples e mais rápido.

Está disponível no repositório do Ubuntu e pode ser instalado com este comando

sudo apt-get install regexxer
    
por Seann 24.08.2016 / 18:23