2010-05-10 8 views
3

После bash-hackers wiki's recommendation, я хочу редактировать файлы с помощью ed.Использование ed для управления файлами, которые соответствуют

В частности, я хочу сделать следующее с изд вместо СЭД:

find . -type f -exec sed -i -e 's/a/b/g' {} \; 

Я вижу, что редактор не имеет неавтоматического, как СЕПГ -e, так что, насколько я знаю, трубы и Ио переназначения являются единственным способом работать с ним не интерактивно.

Таким образом, используя ред от Баш скрипт, чтобы сделать то же самое, как выше SED команды будет выглядеть следующим образом:

ed file_name <<<$'g/a/s//b/g\nw' 

Или

echo $'g/a/s//b/g\nw' | ed file_name 

Но, насколько я знаю, что это невозможно задействовать каналы или io перенаправления в find -exec.

Пропустить что-нибудь? или это единственный способ преодолеть это - использовать циклы?

for file in $(find . -type f -print); do ed $file <<<$'g/a/s//b/g\nw'; done; 

ответ

4
find . -type f -exec bash -c 'ed -s "$2" <<< "$1"' _ $'g/a/s//b/g\nw' {} \; 

И версия POSIX:

find . -type f -exec sh -c 'printf "%s\n" "g/a/s//b/g" w | ed -s "$1"' _ {} \; 

Основная причина использования ред над SED -i, что редактор редактирует файлы при СЕПГ -i перезаписывает файлы, и это проблема, если вам посчастливилось иметь ссылки, которые вы не хотите сломать.

0

Поместите команду ed со всеми перенаправлениями и «здесь документами» в сценарий оболочки и вызовите это из find.

Но я должен спросить: зачем? Как вы думаете, что вы можете сделать с ed, что вы не можете сделать с sed?

+0

См. Ссылку, о которой я упомянул, и ответ Гейрхи. – theosp

1

Эта находка & ред сниппет имеет тестовый режим (так что вы можете подтвердить, что вы получили ваш регулярное выражение прямо перед тем, как acutal масса заменить операцию):

Поиск & заменить с найти & ред

http://codesnippets.joyent.com/posts/show/2299