знайти & sed (пошук і заміна)


27

Я використовую таку команду на своєму 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 .

2
Це саме те, що ти працюєш? Що робити, якщо ви видалите -execі все після нього? Чи друкує назви файлів Java? (Я переживаю, що ви використовуєте розумні котирування замість цитат ASCII.)
Мікель

1
Власне, це і вирішує це, принаймні для мене. Як подвійні, так і одиничні лапки повинні бути замінені відповідно "і ', відповідно.
Лев Левицький

2
Розумні (?) Цитати! .. :)
Пітер.О

Що я вклеював, було саме те, що я бігав. Чи може хтось відповісти?
Амір Афгані

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 та @ pitter-dog за вдосконалення моєї відповіді з вашими коментарями.


Що роблять фігурні брекети?
Зейн Хічкокс

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