Использование ed для манипулирования файлами, подобранными с помощью find - PullRequest
3 голосов
/ 11 мая 2010

Следуя рекомендации bash-hackers wiki , я хочу редактировать файлы, используя ed.

В частности, я хочу сделать следующее с ed вместо sed:

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

Я вижу, что ed не имеет значения, подобного sed -e, поэтому, насколько я знаю, каналы и перенаправления io - единственный способ работать с ним неинтерактивно.

Таким образом, использование ed из bash-скрипта для выполнения тех же действий, что и приведенная выше команда 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;

Ответы [ 3 ]

4 голосов
/ 11 мая 2010
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"' _ {} \;

Основная причина использования ed поверх sed -i заключается в том, что ed редактирует файлы, а sed -i перезаписывает файлы, и это проблема, если у вас есть ссылки, которые вы не хотите разрывать.

1 голос
/ 11 мая 2010

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

Поиск и замена на find & ed

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

0 голосов
/ 11 мая 2010

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

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

...