Я использую следующую команду на моем Mac:
$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;
и это, кажется, не имеет никакого эффекта.
У меня есть два файла в каталоге, которые заканчиваются на .java, и оба имеют текст foo. Я что-то пропустил?
РЕДАКТИРОВАТЬ: Результаты запроса комментариев
[aafghani-03:~/test amirafghani]$ find . -name "*.java" -exec sed -i 's/foo/bar/g' {} \;
sed: 1: "./bar.java": invalid command code .
sed: 1: "./foo.java": invalid command code .
-exec
все и после него? Распечатывает ли имена файлов Java? (Я беспокоюсь, что вы используете умные кавычки вместо кавычек ASCII.)"
и'
, соответственно.Ответы:
Прежде всего, убедитесь, что вы используете обычные кавычки ascii, такие как
"
и'
(коды ascii0x22
и0x27
, соответственно), в сценариях оболочки, потому что пример в вашем посте содержит нестандартные символы кавычек. Если вы посмотрите внимательно, они выглядят немного по-другому. Скорее всего, это ошибка копирования-вставки из форматированного текстового документа, такого как Word, OOWriter или даже из окна браузера.Поскольку вы работаете на Mac, скорее всего, у вас есть реализация FreeBSD
sed
, и в этом случае вы должны написать команду следующим образом:(здесь используется
+
вместо того,\;
чтобы не запускать одинsed
вызов на файл).В реализации FreeBSD для
sed
этого-i
флага необходим аргумент: расширение файла резервной копии. Например, с помощью-i .bak
этой команды выполняется резервное копированиеfile1.txt
вfile1.txt.bak
первую очередь перед выполнением замены в исходном файле. Использование пустого аргумента''
означает не использовать файл резервной копии, который, кажется, то, что вы хотите.То же самое в реализации GNU (или NetBSD, OpenBSD, busybox) будет:
Спасибо @bahamat и @Mikel и @ Pieter-порода для улучшения моего ответа с вашими комментариями.
источник