Просто получил удар по моему сценарию sed - почему? - PullRequest
0 голосов
/ 22 ноября 2010

Основываясь на полезных ответах, которые я получил здесь , я создал следующий скрипт, назвал его convert_image_paths.command, поместил его в папку веб-сайта на моем Mac и дважды щелкнул по нему.

#!/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' {} ';'

К сожалению, вместо изменения относительных путей изображений на веб-сайте на новый URL-адрес CDN, он

  1. удвоил URL: http://mycdn.com/http://mycdn.com/images/myimage.png
  2. Сделал это для КАЖДОГО файла html / css на моей машине

Так что мой вопрос: а) есть ли тег для дебила и б) как мне исправить этот скрипт?

РЕДАКТИРОВАТЬ:

Позвольте мне уточнить мое намерение: я хотел применить изменения ко всем путям изображения с относительными URL в виде

"image / {myimagepath}"

или

" ../ images / {myimagepath} "

Ответы [ 3 ]

4 голосов
/ 22 ноября 2010

Чтобы ответить на ваш второй вопрос:

б) Не делай "найти". когда вы не знаете, с какого каталога начинается скрипт. Если вы хотите, чтобы он запускался из определенного каталога, укажите это в команде find: find /Users/ptomblin/Shared/ ...

Что касается того, почему он удвоил URL, это потому, что вы сказали ему.

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

Принимает каждый экземпляр слова "images /" и заменяет его на "http://mycdn.com/images/",, даже если оно уже начиналось с" http://mycdn.com/".. Если это не то, что вы хотели, вам нужно будет более подробно рассказать о своем регулярное выражение.

В качестве первой попытки я бы заменил ОБА строки на следующие

find /Users/ptomblin/Shared -name "*.css" -o -name "*.html" -exec sed -i '' 's@".{0,2}/?images@"http://mycdn.com/images@g' {}

Это заменит images или ../images, только если они начинаются с двойной кавычки.

1 голос
/ 22 ноября 2010

Я также выяснил, почему мой оригинальный скрипт не распознал его текущий каталог.На Mac, если вы назовете файл сценария с расширением .command, он станет двойным щелчком.Однако при двойном щелчке вместо командной строки он меняет свой рабочий каталог на домашний каталог пользователя!

myscript.команда:

echo "pwd = `pwd`"

. / myscript.command: pwd = текущий каталог

myscript.command двойной щелчок: pwd = домашний каталог пользователя

1 голос
/ 22 ноября 2010

find . означает «найти в текущем каталоге» - поэтому обязательно запустите его из каталога, в котором вы хотите произвести подстановку во всем содержимом, или измените сценарий на аргументы:

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

find "$@" ...

Мое предположение о том, почему вещи удвоились, просто то, что они были запущены дважды; эта вторая подстановка в исходном скрипте увидит "http://mycdn.com/images" и снова заменит изображения! Вот очевидный способ объединить две подстановки и решить эту проблему одновременно:

sed -i 's@"\(\.\./\|\)images/@"http://mycdn.com/images/@g'

Сопоставьте с открытой цитатой, чтобы убедиться, что вы не замените, когда уже есть http: // ..., и при желании сопоставьте ../ после него.

Я бы определенно предложил провести тестирование, запустив его для одного файла, с результатами, напечатанными на стандартный вывод вместо редактирования на месте:

sed 's@...@...@' <file>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...