.png)
Я использую следующую команду на своем Mac:
$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;
и, похоже, это не имеет никакого эффекта.
У меня есть два файла в каталоге, которые заканчиваются на .java, и в обоих есть текст foo. Я что-то упускаю?
EDIT: Результаты запроса комментариев
[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 .
решение1
Прежде всего, убедитесь, что вы используете обычные кавычки ascii, такие как "
и '
(коды ascii 0x22
и 0x27
, соответственно) в скриптах оболочки, поскольку пример в вашем посте содержит нестандартные символы кавычек. Если вы посмотрите внимательно, они выглядят немного иначе. Скорее всего, это ошибка копирования-вставки из формата документа Rich Text, такого как Word, OOWriter или даже окна браузера.
Поскольку вы работаете на Mac, у вас, скорее всего, установлена реализация FreeBSD sed
, в этом случае вам придется написать команду следующим образом:
find . -name "*.java" -exec sed -i '' "s/foo/bar/g" {} +
(здесь используется +
вместо , \;
чтобы избежать запуска одного sed
вызова для каждого файла).
Обратите внимание, что кавычки "s/foo/bar/g"
необходимы, если foo
или bar
содержат пробелы.
В реализации FreeBSD sed
флагу -i
требуется аргумент: расширение файла резервной копии. Например, команда сначала -i .bak
сделает резервную копию, прежде чем выполнять замену в исходном файле. Использование пустого аргумента означает, что файл резервной копии не используется, что, похоже, и нужно.file1.txt
file1.txt.bak
''
То же самое в реализации GNU (или NetBSD, OpenBSD, busybox) будет выглядеть так:
find . -name "*.java" -exec sed -i "s/foo/bar/g" {} +
Спасибо@bahamatи@Микельи@pieter-breedза улучшение моего ответа с помощью ваших комментариев.