У меня есть сценарий, я записал, что это, как предполагается, заменяет 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
- связанные вопросы.
Эхо цикла каждый проанализированный файл, правильно соответствует самому сценарию и пропускает его, но никакие файлы на самом деле не изменены. Я бездельничал с этим в течение нескольких дней теперь и действительно раздражал!
Как упомянуто steeldriver, одинарные кавычки подавляют все расширения оболочки, таким образом $OLDSTR
передается буквально sed
. Так как это на самом деле не происходит в файлах, это ничему не соответствует, таким образом, ничто не сделано. Можно передать переменные sed
двойные кавычки использования:
sed -i -- "s#$OLDSTR#$NEWSTR#g" "$file"
, но возможно в общем более безопасно включить и выключить сильное заключение в кавычки и двойную кавычку переменные, как Вы обычно были бы
sed -i -- 's#'"$OLDSTR"'#'"$NEWSTR"'#g' "$file"
Ну, я разочаровался в слонянии без дела с sed
после того, как я обнаружил Regexxer, который был точно, в чем я нуждался. sed
имеет, это - использование, несомненно, но Regexxer был намного более простым и путь быстрее.
Это доступно в репозитории Ubuntu и может быть установлено с этой командой
sudo apt-get install regexxer