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é!
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"
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