2010-11-22 3 views
0

На основании полезных ответов я получил here, я создал следующий скрипт, названный им 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, он

  1. Рскладной вверх URL: http://mycdn.com/http://mycdn.com/images/myimage.png
  2. ли, что для каждого файла HTML/CSS на моя машина

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

EDIT:

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

"изображение/{myimagepath}"

или

"../images/{myimagepath}"

+0

И это почему вы тестируете с помощью -e и используете только -i, когда знаете, что это работает. – Sorpigal

+0

Не имеет никакого отношения к '-e'. Просто запустите его без '-i'; это опция, которая сообщает sed редактировать файлы вместо того, чтобы печатать результат в stdout. '-e' сообщает sed, что следующий аргумент - команда sed для выполнения. 'sed -e ' полностью эквивалентен 'sed '; это в основном полезно для запуска нескольких команд. – Cascabel

ответ

4

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

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

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

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

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

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

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

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

+0

спасибо, так как бы я заменил «http: // mycdn/images/{myimage}» на «images/{myimage}» без удвоения? – Yarin

+0

@ Ярин, см. Мое редактирование. –

+0

beautiful- большое спасибо – Yarin

1

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

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

find "[email protected]" ... 

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

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

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

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

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

Большое спасибо за код безопасности пути, хотя я до сих пор не понимаю, как это произошло, поскольку я решил запустить его из соответствующего каталога. Что касается кода регулярного выражения, я уточнил, что я предполагал преобразование в вопрос (см. правки) - любые хорошие идеи с одним вкладышем? – Yarin

+0

@ Ярин: Отредактировано исправление. Работы Павла Томблина одинаково хорошо работают; мы просто писали шаблоны по-разному. Его немного короче, мне легче общаться, если есть другой возможный префикс. – Cascabel

+0

Большое спасибо за это. Жаль, что я мог бы дать вам обоих ребятам кредит – Yarin

1

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

myscript.command:

echo "pwd = `pwd`" 

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

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

Смежные вопросы