Как правильно искать и заменять sed без смены владельца - PullRequest
4 голосов
/ 09 апреля 2010

Я нашел этот пример поиска и замены в командной строке:

find . -type f -print0 | xargs -0 sed -i 's/find/replace/g'

Он работал нормально, за исключением того, что он изменил дату и владельца файла для КАЖДОГО файла, который просматривал, даже для тех, которые не содержали текст поиска.

Как лучше решить эту задачу?

Ответы [ 3 ]

4 голосов
/ 09 апреля 2010

Использование опции -c (если вы работаете в Linux) должно привести к тому, что sed сохранит владение. Поскольку вы используете команду, она фактически переписывает каждый файл, даже если она не вносит изменений в файлы, которые не содержат find.

3 голосов
/ 09 апреля 2010

Самый простой способ исправить это - выполнить sed для файлов, только если они содержат текст с использованием grep:

find . -type f | while read file; do
    grep -q find $file && sed -i 's/find/replace/g' $file
done

Это требует чтения каждого файла дважды (в худшем случае), поэтому это может быть немного медленнее. Надеемся, однако, что ваша ОС должна хранить файл в своем дисковом кеше, так что вы не увидите значительного замедления, поскольку этот процесс определенно связан с вводом / выводом, а не с процессором.

1 голос
/ 23 сентября 2016

Некоторые версии дистрибутива sed (а именно RedHat и семейство) добавили опцию -c, которая выполняет это, в этом случае см. Ответ @ Исаака.

Но для тех, у кого нет патчей GNU sed, самый простой способ, который я нашел, - это просто заменить на perl, который перезаписывает файлы, подобные sed -c, когда они доступны. Следующие команды в основном эквивалентны:

sed -ci 's/find/replace/'
perl -pi -e 's/find/replace/'

Только не слишком волнуйтесь и делайте perl -pie; как и в случае sed -ie, вместо интерпретации в качестве другого параметра он будет использовать e в качестве аргумента для -i и использовать его в качестве суффикса для резервного копирования исходного файла. Подробнее см. perldoc perlrun.

Разбор регулярных выражений в Perl немного отличается от sed (лучше, imo) для более сложных вещей: вообще говоря, используйте меньше обратных слеш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...