[РЕШЕНО]замена sed текста типа http://site.ru/

Накоплен некоторый материал, в нем как-то так сложилось, что все пути записаны в абсолютном виде типа http://site.ru/tra-la-la. Дохрена таких записей. А возникла необходимость сделать их относительными, т.е. удалить везде http://site.ru/. Пытаюсь сделать замену в тексте средствами sed и обламываюсь - в искомом тексте и :, и / , которые sed используют для форматирования команды. Как только не пробовал обернуть, все бестолку. Кто что присоветует?
wau
искомом тексте и :, и / , которые sed используют для форматирования команды
Вообще-то слэш экранируется таким образом не всегда
\/
в выражениях sed. В качестве разделителя операндов в нем может использоваться не только слэш, а например @

Я разбирался с ним, когда собирал LFS, и оставил для себя такую заметочку.

$ for file in \
> $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
> do
> cp -uv $file{,.orig}
> sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
> -e 's@/usr@/tools@g' $file.orig > $file
> echo '
> #undef STANDARD_STARTFILE_PREFIX_1
> #undef STANDARD_STARTFILE_PREFIX_2
> #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
> #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
> touch $file.orig
> done

М-да… первый взгляд на эту команду вселил в меня ужас. На самом же деле тут в цикле перебираются файлы inux64.h, linux.h, sysv4.h, при условии их наличия в каталоге gcc/config. Каждый из них копируется в новый файл с суффиксом *.orig (сохраняем оригиналы исходников — затем они будут понставлены в качестве потока ввода для sed), а затем в каждом из найденных файлов производится подстановка /tools к пути поиска линкера ld и замена /usr на /tools. Кроме того в конец каждого из файлов добавляется переопредение макросов STANDARD_STARTFILE_PREFIX_1 и STANDARD_STARTFILE_PREFIX_2, так, чтобы они указывали на верные пути к библиотекам. Далее командой touch модифицируется время последнего изменения всех обрабатываемых файлов на текущее, что в сочетании с ключом -u команды cp (копировать если файл-источник новее чем файл назначения) предотвращает нежелательные изменения при случайном повторном выполнении команды.

sed — потоковый текстовый редактор, выполняющий операции над текстовыми файлу по шаблонам, определяемым регулярными выражениями.

Когда я первый раз открыл LFS, я имел представление о синтаксисе sed ровно такое же, как слушательница курсов исскусств имени Леонардо да Винчи о сельском хозяйстве. Однако упорное гугление привело меня к следующим мыслям

так как в обрабатываемых путях присутствует символ "/", в sed вместо разделителя операндов использован символ "@"
конструкции вида "\(64\)\?" и "\(32\)\?" сообщаяют sed-у, что искомая строка может как содержать, так и не содержать строки «64» и «32» — операция должна быть произведена в обоих случаях.
символ "&" указывает, что /tools будет поставлено перед искомыми строками (то есть на месте "&" будет находится найденное выражение)
Таким образом выражение 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' разобрано мной так — найти все строки, содержащие "/lib", "/lib64" и "/lib32" и поставить перед ними строку "/tools", а выражение 's@/usr@/tools@g' — найти все строки, содержащие "/usr" и заменить их на "/tools"
В общем, сборка временной системы (да и основной тоже) буквальна пропитана применением подобных конструкций. Желательно постараться вникнуть в их смысл, а команды набивать руками. Тогда к концу процесса сборки вас ожидает просветеление по многим вопросам, касающихся приемов обработки текстов и работы в *nix-консоли.

Следующая команда:

$ sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure

вносит исправление в скрипт конфигуратора, однако в моем случае она не внесла в него никаких изменений. По книге она направлена на изменения характера работы gcc с защитой стека.
Может наведет на мысли
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
Спасибо за помощь, все получилось!
 
Зарегистрироваться или войдите чтобы оставить сообщение.