Подобно этому пользователю У меня возникла проблема при запуске sed
всех файлов в репозитории, когда некоторые из отслеживаемых файлов являются двоичными.
Ни git ls-files
, ни некоторые решения git-grep по этому вопросу, такие как git grep --full-name -l '.'
, игнорируют двоичные файлы, поэтому передавайте их в sed.
git ls-files | xargs sed -i '' 's/here/there/g'
вызывает ошибку «sed: ошибка RE: недопустимая последовательность байтов».
Как я могу запустить sed для всех файлов, которые он может запустить, и просто игнорировать двоичные файлы?
Замените git ls-files
на git grep -lI .
. На самом деле, вероятно, было бы лучше, если бы вы использовали git grep -lI 'here' | ...
, чтобы запускать sed
только для файлов, содержащих строку, соответствующую регулярному выражению, используемому в вашей команде sed, то есть:
git grep -lI 'here' | xargs sed -i '' 's/here/there/g'
-I Don’t match the pattern in binary files.
Я не был уверен, стоит ли сначала использовать grep для одного и того же шаблона, потому что, возможно, grep и sed не будут обрабатывать все шаблоны одинаково?
По умолчанию они не будут одинаковыми, например. попробуйте grep 'foo/bar'
vs sed 's/foo/bar/stuff/'
(это должно быть 'foo/bar'
в sed или измените разделитель с /
на какой-нибудь другой символ), но это незначительные различия, которые, я уверен, вы можете легко обойти. В противном случае просто используйте .
в качестве регулярного выражения grep
и живите с тем фактом, что sed
затем коснется всех текстовых файлов.
i
), чтобы игнорировать двоичные файлы.