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


27

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

2
Это именно то, что вы бежите? Что делать, если вы удалите -execвсе и после него? Распечатывает ли имена файлов Java? (Я беспокоюсь, что вы используете умные кавычки вместо кавычек ASCII.)
Mikel

1
На самом деле, это решает, по крайней мере, для меня. Двойные и одинарные кавычки должны быть заменены на "и ', соответственно.
Лев Левицкий

2
Умные (?) Цитаты! .. :)
Peter.O

То, что я вставил, было именно тем, что я бежал. Может кто-нибудь опубликовать ответ?
Амир Афгани

1
В следующий раз, пожалуйста, опубликуйте сообщение об ошибке, которое вы видите, когда задаете вопрос. Это сэкономит время для всех.
Микель

Ответы:


34

Прежде всего, убедитесь, что вы используете обычные кавычки ascii, такие как "и '(коды ascii 0x22и 0x27, соответственно), в сценариях оболочки, потому что пример в вашем посте содержит нестандартные символы кавычек. Если вы посмотрите внимательно, они выглядят немного по-другому. Скорее всего, это ошибка копирования-вставки из форматированного текстового документа, такого как Word, OOWriter или даже из окна браузера.

Поскольку вы работаете на Mac, скорее всего, у вас есть реализация FreeBSD sed, и в этом случае вы должны написать команду следующим образом:

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

(здесь используется +вместо того, \;чтобы не запускать один sedвызов на файл).

В реализации 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 и @Mikel и @ Pieter-порода для улучшения моего ответа с вашими комментариями.


Что делают фигурные скобки?
Зейн Хичкокс

3
@ZaneHitchcox фигурные скобки являются заполнителями для совпадающего имени файла
janos
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.