web-dev-qa-db-fra.com

Problème d'utilisation de sed pour remplacer les URL dans les fichiers HTML par un script

J'ai un script que j'ai écrit qui est supposé remplacer les adresses URL référencées dans tous les fichiers d'un répertoire par une adresse locale, et cela ne semble pas fonctionner, et je me demande si quelqu'un peut me donner un aperçu et me dire quoi Je me trompe.

Mon script est le suivant:

#!/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
)

Parce que je travaille avec des URL et des chemins Unix natifs, j'ai choisi d'utiliser # comme délimiteur pour sed plutôt que /, comme cela est fréquemment utilisé dans les réponses à d'autres sed. -questions connexes.

La boucle renvoie chaque fichier analysé, associe correctement le script et le saute, mais aucun fichier n'est réellement modifié. Cela fait plusieurs jours que je déconne avec ça et je suis vraiment énervé!

2
Seann

Comme mentionné par steeldriver, les guillemets simples suppriment toutes les extensions Shell. $OLDSTR est donc passé littéralement à sed. Comme cela ne se produit pas réellement dans les fichiers, cela ne correspond à rien, donc rien n'est fait. Vous pouvez transmettre des variables à sed à l'aide de guillemets doubles:

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

mais peut-être en général il est plus sûr d'activer et de désactiver les guillemets forts, et de citer les variables comme vous le feriez

 sed -i -- 's#'"$OLDSTR"'#'"$NEWSTR"'#g' "$file"
3
Zanna

Eh bien, j’ai renoncé à jongler avec sed après avoir découvert Regexxer , ce qui était exactement ce dont j'avais besoin. sed a ses utilisations, sans doute, mais Regexxer était beaucoup plus simple et beaucoup plus rapide.

Il est disponible dans le référentiel Ubuntu et peut être installé avec cette commande

Sudo apt-get install regexxer
1
Seann