Як sed і замінити рядок на шлях до папки


14

Я намагаюся написати наступний сценарій bash:

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) ed трохи світла
Олександр Холден Далі

Відповіді:


23

За обставин, коли рядок заміни або рядок шаблону містять косої риси, ви можете скористатися тим, що GNU sed дозволяє альтернативному роздільнику команди замінити. Типовим вибором для роздільника є символ "pipe" |або хеш #- найкращий вибір розміжувального символу часто залежатиме від типу файлу, який обробляється. У вашому випадку ви можете спробувати

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

Просто ви можете уникнути використання all-caps для користувацьких змінних у вашому сценарії - вони повинні бути зарезервовані для системних змінних. Також gкомутатор не потрібен, якщо ви не хочете робити кілька замін в одному рядку.


0

Жорстке кодування змінної 'opt / home' буде працювати так.

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.