Как я могу добавить тег к началу нескольких файлов?


Ответы:


18
sed -i "1s/^/<?php /" file

(Это -iдля редактирования на месте.)

Более портативная версия:

ed file <<!
1s/^/<?php /
wq
!

отличный - это немного проще, чем я собирался описать :)
Уоррен

Мне нужно добавить расширение к аргументу -i здесь. Вы используете sed или GNU sed?

Ричард: тот, который я использую, претендует на звание GNU sed, и он позволяет добавлять суффикс резервной копии.
user1686

2
Я использую BSD sed, и он позволяет редактировать на месте, но мне нужно дать ему расширение. то есть «файл sed -i .bak« PATTERN »»

3
-iне является переносимым, синтаксис отличается между реализациями, и это ломает символические ссылки. Вам лучше использовать приложение, которое на самом деле предназначено для редактирования файлов.
Крис Даун

5

Вы можете использовать такой AWKфильтр,

awk '{if (NR == 1) printf "% s% s", "PREFIX", $ 0; иначе выведите $ 0} 'testfile> newfile

Где PREFIXваша строка префикса php.


5

Я пока не могу оставить комментарий, но сделаю все за один шаг:

find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;

Люблю это, сэкономил мне часы.
Стив Хилл

5

Вы можете сделать это с помощью perl one-liner:

perl -0777 -p -i -e "s/^/hey /g" testfile

В -0777силы файл-прихлебывая режим, так что весь файл читается как одна строка. -pпозволяет зацикливание. -iпозволяет редактировать файл на месте. ^указывает начало строки.

$ cp testfile1 testfile; perl -0777 -p -i -e "s/^/hey /g" testfile; diff testfile testfile1
1c1
< hey asdf
---
> asdf

Обновление: как указано в комментариях, вы можете выбрать автоматическое создание резервной копии, используя -i.bakвместо -i. Это обеспечивает дополнительную безопасность в случае ошибок в вашей команде. Аргумент к -i становится суффиксом резервной копии.

При обновлении группы файлов вы можете выполнить команду с помощью -i.backup${RANDOM}, убедиться, что все файлы обновлены правильно, а затем удалить все файлы с таким расширением.


1
«Значение 0777 приведет к тому, что Perl будет отбраковывать файлы целиком, потому что нет никакого легального байта с этим значением», см. Sial.org/howto/perl/one-liner/#s3.5
Крис В.

1
Если вы рекомендуете использовать -iфлаг без суффикса, пожалуйста, предупредите читателей, что это означает, что вы не получите резервную копию . Еще на несколько символов ( -i.bak) вы получите резервную копию на случай, если в одной строке содержится опечатка. Довольно простая опечатка (скажем, забывание -pфлага) может испортить весь ваш день в противном случае.
Телемах

@Telemachus - Согласен. Обновлено.

4

sedдля редактирования потоков - файл не является потоком. Используйте программу, которая предназначена для этой цели, например edили ex. -iВозможность sedне только не портативный, он будет также нарушать любые символические ссылки , которые могут возникнуть, так как она , по существу удаляет его и воссоздает его, что не имеет смысла.

for file in foo bar baz; do
    ed -s "${file}" << EOF
0a
<?php 
.
w
EOF
done

То, что вы представили, является основным способом редактирования одного файла. Похоже, это не решает проблему - вопрос касается изменения количества файлов (хотя это может быть неочевидно на первый взгляд). Если вы знаете, как использовать edдля этой цели, покажите это в своем ответе.
rozcietrzewiacz

@rozcietrzewiacz - Поскольку grawity продемонстрировала один и тот же метод редактирования одного файла (который был принят), я подумал, что это уместно для ответа. В любом случае, я поместил это в цикл for, который должен облегчить ваши проблемы.
Крис Даун

0

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

for FNAME in *
do
    echo "?>" >> $FNAME
done

хотя мне нравится твой findоднострочник :)


$FNAMEдолжно быть $fname- по соглашению мы используем заглавные переменные среды (PAGER, EDITOR, SHELL, ...) и переменные внутренней оболочки (BASH_VERSION, RANDOM, ...). Все остальные имена переменных должны содержать хотя бы одну строчную букву. Это соглашение позволяет избежать случайного переопределения внешних и внутренних переменных.
Крис Даун

@ Крис Down - конвенция я видел всю свою карьеру отклонилась настройки: нижний регистр, верхний регистр, и верблюжьего :)
заповедное

Верблюд и строчные в порядке. В любом случае, переменные, которые не являются переменными среды, не должны быть в верхнем регистре.
Крис Даун

0

Есть простой способ

echo "startstr$(cat filename)endstring" > filename.new

Это порвет с последующими символами новой строки.
Крис Даун

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