Как я могу заменить путь другим путем в файле с помощью команды sed? И когда он используется в качестве переменной в скрипте, он работает.
sed -i "s/"system_filter = /etc/define_filter_file"/"system_filter = /usr/local/etc/file_regex"/g" /etc/exi.conf.bak
Вам нужно избежать всех слэшей в предоставленных путях и изменить открывающие и завершающие кавычки на одинарные.
sed -i 's/"system_filter = \/etc\/define_filter_file"/"system_filter = \/usr\/local\/etc\/file_regex"/g' /etc/exi.conf.bak
Команда выражается как:
sed -i 's/path1/path2/g'
Путь1 и путь2 не могут явно содержать /
так как это будет перепутано со всем выражением.
Из руководства infotex по GNU sed (см. info sed
):
Синтаксис
s
(как в заменителе) командаs/REGEXP/REPLACEMENT/FLAGS
. В/
символы могут быть одинаковыми заменен любым другим одиночным символом1 в пределах любого данногоs
команда. В/
символ (или любой другой символ, используемый вместо него) может появиться в REGEXP или REPLACEMENT, только если ему предшествует\
персонаж.
т.е. использовать | поскольку разделитель между REGEXP и заменой и командой sed становится:
sed -i 's|"system_filter = /etc/define_filter_file"|"system_filter = /usr/local/etc/file_regex"|g' /etc/exi.conf.bak
или короче:
sed s|/some/path|/alternate/path/|
что намного проще, чем альтернатива, избегая большого количества косых черт:
sed s/\/some\/path/\/alternate\/path\//
1.(The sed
страница руководства в OSX явно исключает обратную косую черту \ и символы новой строки из указанной выше квалификации "любой другой одиночный символ" )