Назад | Перейти на главную страницу

Невозможно заменить путь с помощью sed

Как я могу заменить путь другим путем в файле с помощью команды 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 явно исключает обратную косую черту \ и символы новой строки из указанной выше квалификации "любой другой одиночный символ" )