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

18

Мне нужно добавить теги PHP, окружающие файл. Добавить их легко, используя

find . -exec echo "?>" >> '{}' \;

но как я могу добавить тег <?php?

Жиль "ТАК - перестань быть злым"
источник

Ответы:

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

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

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

ed file <<!
1s/^/<?php /
wq
!
user1686
источник
отличный - это немного проще, чем я собирался описать :)
Уоррен
Мне нужно добавить расширение к аргументу -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.

Nik
источник
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
Hogan
источник
Это порвет с последующими символами новой строки.
Крис Даун
@ChrisDown концевые строки в файле?
Хоган