Как собрать и заменить строку на путь к папке

14

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

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"

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

Кто-нибудь может пролить свет?

Благодарность

Фелипе Калдас
источник
Вы имеете в виду, s (h) немного света
Александр Холден Дейли

Ответы:

23

В тех случаях, когда строка замены или строка шаблона содержат косую черту, вы можете использовать тот факт, что 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переключение не требуется, если вы не хотите сделать несколько замен в одной строке.

steeldriver
источник
0

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

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
user_of_ubuntu_linux
источник