Проблема с помощью sed для замены URL в файлах HTML со сценарием

У меня есть сценарий, я записал, что это, как предполагается, заменяет URL, на которые ссылаются во всех файлах в каталоге с локальным адресом, и это, кажется, не работает, и я задаюсь вопросом, может ли кто-то предоставить мне некоторое понимание и сказать мне, что я делаю неправильно.

Мой сценарий следующие:

#!/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
)

Поскольку я работаю с URL и собственными путями Unix, я решил использовать # как разделитель для sedвместо / как часто используется в ответах на другой sed- связанные вопросы.

Эхо цикла каждый проанализированный файл, правильно соответствует самому сценарию и пропускает его, но никакие файлы на самом деле не изменены. Я бездельничал с этим в течение нескольких дней теперь и действительно раздражал!

2
задан 28 August 2016 в 23:57

2 ответа

Как упомянуто steeldriver, одинарные кавычки подавляют все расширения оболочки, таким образом $OLDSTR передается буквально sed. Так как это на самом деле не происходит в файлах, это ничему не соответствует, таким образом, ничто не сделано. Можно передать переменные sed двойные кавычки использования:

 sed -i -- "s#$OLDSTR#$NEWSTR#g" "$file"

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

 sed -i -- 's#'"$OLDSTR"'#'"$NEWSTR"'#g' "$file"
3
ответ дан 2 December 2019 в 02:17

Ну, я разочаровался в слонянии без дела с sed после того, как я обнаружил Regexxer, который был точно, в чем я нуждался. sed имеет, это - использование, несомненно, но Regexxer был намного более простым и путь быстрее.

Это доступно в репозитории Ubuntu и может быть установлено с этой командой

sudo apt-get install regexxer
1
ответ дан 2 December 2019 в 02:17

Другие вопросы по тегам:

Похожие вопросы: