2010-11-22 4 views
0

Basé sur les réponses utiles que j'ai reçues here, j'ai créé le script suivant, l'a nommé convert_image_paths.command, l'ai placé dans un dossier de site Web sur mon mac et l'ai double-cliqué dessus.Je me suis fait défoncer par mon script sed - pourquoi?

#!/bin/bash 

# This script will operate on valid relative image paths at this level and one sub-level down, across .html and .css files. 

find . -name "*.css" -o -name "*.html" -exec sed -i '' 's/\.\.\/images\//images\//g' {} ';' 
find . -name "*.css" -o -name "*.html" -exec sed -i '' 's/images\//http:\/\/mycdn\.com\/images\//g' {} ';' 

Malheureusement, au lieu de changer les chemins relatifs dans le site vers la nouvelle URL cdn, il

  1. dédoublée l'url: http://mycdn.com/http://mycdn.com/images/myimage.png
  2. Est-ce que pour chaque fichier html/css sur ma machine

Donc ma question est a) y a-t-il une balise pour crétin et b) comment réparer ce script?

EDIT:

Permettez-moi de préciser mon intention: Je voulais appliquer la modification à tous les chemins d'image avec urls par rapport sous la forme

"image/{myimagepath}"

ou

"../images/{myimagepath}"

+0

Et c'est pourquoi vous testez avec -e et utilisez seulement -i quand vous savez que cela fonctionne. – Sorpigal

+0

N'a vraiment rien à voir avec '-e'. Il suffit de le lancer sans '-i' d'abord; C'est l'option qui dit à sed d'éditer les fichiers en place au lieu d'imprimer le résultat sur stdout. '-e' dit à sed que l'argument suivant est une commande sed à exécuter. 'sed -e ' est complètement équivalent à 'sed '; C'est surtout utile pour exécuter plusieurs commandes. – Cascabel

Répondre

4

Pour répondre à votre deuxième question:

b) Ne pas faire "trouver." lorsque vous ne savez pas à partir de quel répertoire commence le script. Si vous voulez le démarrer à partir d'un répertoire particulier, dites-le dans la commande find: find /Users/ptomblin/Shared/ ...

Pour ce qui est de savoir pourquoi il a doublé l'URL, c'est parce que vous l'avez dit.

sed -i '' 's/images\//http:\/\/mycdn\.com\/images\//g' {} 

prend toutes les occurrences du mot « images/» et changé pour « http://mycdn.com/images/ », même si elle a déjà commencé avec « http://mycdn.com/ » . Si ce n'est pas ce que vous vouliez, vous devrez être plus précis sur votre expression rationnelle.

En tant que première tentative, je remplacerais les deux lignes avec les éléments suivants

find /Users/ptomblin/Shared -name "*.css" -o -name "*.html" -exec sed -i '' '[email protected]".{0,2}/[email protected]"http://mycdn.com/[email protected]' {} 

Cela ne remplacera images ou ../images si elles commencent par un guillemet.

+0

merci, alors comment est-ce que je remplacerais "http: // mycdn/images/{myimage}" par "images/{myimage}" sans doubler? – Yarin

+0

@Yarin, voir mon édition. –

+0

belle- merci beaucoup – Yarin

1

find . signifie « trouver dans le répertoire courant » - alors assurez-vous d'exécuter ce à partir d'un répertoire dans lequel vous voulez faire cette substitution dans tous les contenus, ou modifier le script pour prendre des arguments:

#!/bin/bash 
if [ $# -lt 1 ]; then 
    echo "usage: myscript <path>" 
fi 

find "[email protected]" ... 

Ma conjecture sur la raison pour laquelle les choses ont doublé est simplement qu'elle a été exécutée deux fois; cette deuxième substitution dans votre script original verra "http://mycdn.com/images" et substituera des images encore!Voici la façon évidente de combiner les deux substitutions et régler ce problème en même temps:

sed -i '[email protected]"\(\.\./\|\)images/@"http://mycdn.com/images/@g' 

match contre la citation ouverte pour vous assurer que vous ne remplacez pas quand il y a déjà un http: // ..., et éventuellement correspondre à un ../ après.

Je vous conseille vraiment le test en invoquant ce sur un seul fichier, avec des résultats imprimés à stdout au lieu de montage en place:

sed '[email protected]@[email protected]' <file> 
+0

merci beaucoup pour le code de sécurité de chemin- bien que je ne comprends toujours pas comment cela s'est passé car je l'ai couru du répertoire pertinent- Quant au code regex, j'ai clarifié ma conversion prévue dans la question (voir les éditions) - toutes les bonnes idées de one-liner? – Yarin

+0

@Yarin: Edité dans un correctif. Les œuvres de Paul Tomblin vont également bien; nous avons juste écrit des motifs différemment. Il est un peu plus court, le mien est plus facile à jouer s'il y a un autre préfixe possible. – Cascabel

+0

Un grand merci pour cela- J'aimerais pouvoir vous donner à la fois les gars crédit – Yarin

1

Je me suis aussi pourquoi mon script original n'a pas reconnu son répertoire courant. Sur les macs, si vous nommez un fichier script avec l'extension .command, il devient double-cliquable. Cependant, lorsque vous l'exécutez avec un double-clic, au lieu de la ligne de commande, change son répertoire de travail pour le répertoire personnel de l'utilisateur!

myscript.command:

echo "pwd = `pwd`" 

./myscript.command: PWD = répertoire courant

myscript.command double clic: répertoire PWD = User Home

Questions connexes