find & sed (поиск и замена)

find & sed (поиск и замена)

Я использую следующую команду на своем 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.txtfile1.txt.bak''

То же самое в реализации GNU (или NetBSD, OpenBSD, busybox) будет выглядеть так:

find . -name "*.java" -exec sed -i "s/foo/bar/g" {} +

Спасибо@bahamatи@Микельи@pieter-breedза улучшение моего ответа с помощью ваших комментариев.

Связанный контент