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

Помощь с командой SED для замены текста в нескольких файлах

РЕДАКТИРОВАТЬ: Я нашел решение. Эта команда работает, если кому-то она пригодится. Модификатор i.bak создает резервную копию каждого измененного файла.

find /pathoffilestochange -name "*.php" | xargs sed 's|/wrong/path/|/correct/path/|g'

Привет,

Я хочу изменить путь внутри десятков файлов .php. Я не знаю, как использовать sed, но я получил эту команду где-то в Интернете раньше и успешно ее использовал.

 find /ruta -name "*.txt" | xargs sed -i.bak 's/charset=Foo/Bar/g'

За исключением того, что сейчас мне нужно изменить разделители на другой символ, например @. Это моя текущая команда:

find /pathoffilestochange  -name "*.php" | xargs sed -i.bak 's@charset=/wrong/path/@/correct/path/@g'

Он не работает и не выдает ошибок, но я проверяю файлы, и они остаются прежними.

Я выполняю команду от имени пользователя root, который является владельцем файла, и с разрешениями все в порядке, так что это не должно быть проблемой. Я использую Debian.

Какую версию sed вы используете? Работает для меня:

$ cat foo 
hello charset=/wrong/path/fcc yes
$ find . -name foo | xargs sed -i.bak 's@charset=/wrong/path/@/correct/path/@g'
$ cat foo
hello /correct/path/fcc yes
$ sed --version
GNU sed version 4.2.1

Просто заменить зарезервированный разделитель на @ не получится. Что вам нужно сделать, так это избежать таких ударов \/ С \ символ, вы отменяете особое значение символа в регулярном выражении.

Итак, ваша команда должна выглядеть так:

find /pathoffilestochange -name "*.php" | xargs sed -i.bak \ 's/charset=\/wrong\/path\//\/correct\/path\//g'

Это сбивает с толку, но именно так работают регулярные выражения.

Кстати, с одинарной обратной косой чертой после -i.bak Я отменил значение символа новой строки, поэтому я мог эту команду на двух строках для облегчения чтения.