Как к sed и строке замены с путем к папке

Я пытаюсь записать следующий сценарий удара:

HOME_DIR=/opt/my_home
find ./CONFIG -type f -exec sed -i "s/_HOME_DIR_/$_HOME_DIR/g" {} \;

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

users                   = "_HOME_DIR_/config/data/_DOMAIN_/users.conf"

Таким образом, конечный результат должен быть:

users                   = "/opt/my_home/config/data/_DOMAIN_/users.conf"

Но я не получаю это... Я предполагаю, что это из-за символов Escape...

Кто-либо может пролить некоторый свет?

Спасибо

14
задан 22 January 2014 в 05:34

2 ответа

В тех случаях, когда строка замены или строка шаблона содержат косую черту, вы можете использовать тот факт, что GNU sed позволяет использовать альтернативный разделитель для команды замены. Распространенным выбором для разделителя является символ канала | или хэш # - наилучший выбор символа-разделителя часто будет зависеть от типа обрабатываемого файла. В вашем случае вы можете попробовать

sed -i "s#_HOME_DIR_#$HOME_DIR#"

Также обратите внимание, что вы неправильно набрали имя переменной $ HOME_DIR (оно не начинается с подчеркивания).

$ HOME_DIR=/opt/my_home
$ echo "_HOME_DIR_/config/data/_DOMAIN_/users.conf" | sed "s#_HOME_DIR_#$HOME_DIR#"
/opt/my_home/config/data/_DOMAIN_/users.conf

К вашему сведению, вы можете не использовать в своем скрипте прописные буквы для пользовательских переменных - они должны быть зарезервированы для системных переменных. Кроме того, переключатель g не требуется, если вы не хотите выполнять несколько замен в одной строке.

0
ответ дан 22 January 2014 в 05:34

Жесткое кодирование переменной 'opt / home' будет работать следующим образом.

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
0
ответ дан 22 January 2014 в 05:34

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

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