LINUX.ORG.RU

проблемма с заменой текста в файлах bash, sed, replace

 


0

2

приветствую честной форум. прошу помощи в описанной ниже ситуации.

есть текстовый файл (файлы) с расширением .conf содержащие среди прочего текста текст /mntdata/bacula/backup.
нужно /mntdata/bacula/backup заменить на /bacula/backup.

пробовал следующее с различными вариациями
#!/bin/sh
new='/bacula/backup'
old='/mntdata/bacula/backup'
sed -e s/$old/$new/g bacula-dir.conf > bacula-dir.conf.tmp

replace -v $old $new - - bacula-dir.conf

но не работает. подозреваю что проблемма связана с исользованием спецсимволов в переменных (не правильно экранирую или вообще не экранирую) так как текст без слешей заменяется нормально.


sed "s@$old@$new@g" bacula-dir.conf > bacula-dir.conf.tmp

Там символ после команды может быть любой, не обязательно '/'

UPD: И это quick'n'dirty решение, всё равно точка будет интерпретиваться как «любой символ». Нужно экранирование - нужно его писать. Вот здесь решение: http://unix.stackexchange.com/questions/32907/what-characters-do-i-need-to-es...

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 2)

Правильно подозреваешь. Делай так:

new='\/bacula\/backup'
old='\/mntdata\/bacula\/backup'
sed -e "s/$old/$new/g" bacula-dir.conf > bacula-dir.conf.tmp 

ddos3
()

если пути не захардкодены, то лучше что-нибудь, умеюшее нормально «пробрасывать» аргументы:

awk -v n="$new" -v o="$old" '{gsub(o,n)} 1'

anonymous
()

Лишние сущности.

sed -i.bk 's/\/mntdata\/bacula\/backup/\/bacula\/backup/g' bacula-dir.conf
Заменит и создаст резервную копию bacula-dir.conf.bk Или если /mntdata в других путях не используется, то еще проще:
sed -i.bk 's/\/mntdata//g' bacula-dir.conf

ashot ★★★★
()

Еще лучше будет убрать захардкоженные пути из скриптов, потому что сам теперь понимаешь, почему. Заменять, например, на «$bacula_backup_dir».

anonymous
()

Kroz, ddos3 спасибо, помогло. буду курить экранирование

ltaras
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.