Добавить несколько файлов в терминал bash/osx

Я хотел бы добавить некоторый текст к нескольким файлам в bash, я нашел этот пост, посвященный добавлению: Добавлять к файлу одну линейную оболочку?

И я могу найти все файлы, которые мне нужно обработать, используя find:

find ./ -name "somename.txt"

Но как мне объединить их с помощью трубы?


person DEfusion    schedule 06.02.2009    source источник


Ответы (2)


У вас есть несколько вариантов. Самый простой, вероятно, sed:

find ./ -name somename.txt -exec sed -e '1i\
My new text here' {} \;

Будет быстрее, если вы добавите «2q», чтобы сообщить, что вы закончили после подготовки текста, и если это произойдет на месте в файле с флагом -i:

find ./ -name somename.txt -exec sed -i .bak -e '2q;1i\
My new text here' {} \;

Чтобы добавить несколько строк, вам нужно будет заканчивать каждую из них обратной косой чертой.

Это оставляет исходные файлы с расширением .bak.

person Charlie Martin    schedule 06.02.2009
comment
Этот, похоже, сделал это для меня, другие хорошие примеры вставляли текст несколько раз (думаю, по одному для каждой новой строки). Мне просто нужно было добавить файл -type и изменить -e на -i, чтобы получить sed для обновления файлов . - person DEfusion; 06.02.2009
comment
Ага. Использование «iText» соответствует каждой строке, поэтому текст вставляется перед каждой строкой. '1i' соответствует только первой строке. '0a' сделал бы то же самое. «2q» на самом деле не нужен, но удерживает sed от необходимости смотреть на каждую строку и говорить «нет, это тоже не строка 1». - person Charlie Martin; 06.02.2009
comment
Пробовал это: найти . -iname .java -exec sed -e '1i\ / * Copyright (c) 2012 Company X, Inc. Все права защищены. / ' {} \; С этим результатом: sed: 3: 1i\\n/*\n Copyright (c) ...: неверный код команды * - person mvmn; 12.03.2012
comment
Разобрался - для многострочного текста, который я хотел вставить, мне нужно было поставить \ в конце строки, если после него была еще одна строка. В предыдущем комментарии должны были быть разрывы строк, так как мой вставленный текст состоит из нескольких строк. Похоже, их удалили, извините. - person mvmn; 12.03.2012
comment
P.S. Однако осталась одна проблема - файлы не обновлялись, я просто получил вывод в stdout. Пробовал это на Mac OS X 10.6. - person mvmn; 12.03.2012
comment
Решил это. Мне пришлось добавить -i - я знаю, что это во второй команде, но не в первой. - person mvmn; 12.03.2012

find . -name "somefiles-*-.txt" -type f | while read line; do  sed -i 'iThis text gets prepended' -- "$line"; done

or

find . -name "somefiles-*-.txt" -type f | xargs sed -i 'iGets prepended' --

Лучшее (как мне кажется):

find . -name "somefiles-*-.txt" -type f -exec sed -i 'iText that gets prepended (dont remove the i)' -- '{}' \;

Спасибо за недостающую "-подсказку. Тогда я добавил важные --s.

person Johannes Weiss    schedule 06.02.2009
comment
обычно лучше заключать $line ($line) в кавычки. К сожалению, в настоящее время имена файлов с пробелами в них распространены ... - person mitchnull; 06.02.2009
comment
Это может быть GNU-изм; исходный sed хочет, чтобы за 'i\ следовала новая строка, за которой следовал текст, который нужно добавить. - person Charlie Martin; 06.02.2009
comment
Для # 2 вы хотите использовать -print0 с find и -0 с xargs, чтобы избежать проблем с папками с пробелами в их именах. Для #3 вы должны использовать \+ вместо \; чтобы избежать разветвления процесса для каждого файла. - person Adam Rosenfield; 06.02.2009
comment
Для № 3: я пробовал, и новый текст добавлялся перед каждой строкой в ​​исходном файле. Я добавил '1' сразу после флага i (например: -i 'i1Text...'), и это сработало правильно (только один раз в начале) - person Julien-L; 08.12.2012