Мне нужно добавить теги PHP, окружающие файл. Добавить их легко, используя
find . -exec echo "?>" >> '{}' \;
но как я могу добавить тег <?php
?
Мне нужно добавить теги PHP, окружающие файл. Добавить их легко, используя
find . -exec echo "?>" >> '{}' \;
но как я могу добавить тег <?php
?
Ответы:
sed -i "1s/^/<?php /" file
(Это -i
для редактирования на месте.)
Более портативная версия:
ed file <<!
1s/^/<?php /
wq
!
sed
, и он позволяет добавлять суффикс резервной копии.
-i
не является переносимым, синтаксис отличается между реализациями, и это ломает символические ссылки. Вам лучше использовать приложение, которое на самом деле предназначено для редактирования файлов.
Я пока не могу оставить комментарий, но сделаю все за один шаг:
find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;
Вы можете сделать это с помощью 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}
, убедиться, что все файлы обновлены правильно, а затем удалить все файлы с таким расширением.
-i
флаг без суффикса, пожалуйста, предупредите читателей, что это означает, что вы не получите резервную копию . Еще на несколько символов ( -i.bak
) вы получите резервную копию на случай, если в одной строке содержится опечатка. Довольно простая опечатка (скажем, забывание -p
флага) может испортить весь ваш день в противном случае.
sed
для редактирования потоков - файл не является потоком. Используйте программу, которая предназначена для этой цели, например ed
или ex
. -i
Возможность sed
не только не портативный, он будет также нарушать любые символические ссылки , которые могут возникнуть, так как она , по существу удаляет его и воссоздает его, что не имеет смысла.
for file in foo bar baz; do
ed -s "${file}" << EOF
0a
<?php
.
w
EOF
done
ed
для этой цели, покажите это в своем ответе.
Альтернатива тому, что вы написали для добавления чего-либо в конец каждого файла в каталоге (в bash
):
for FNAME in *
do
echo "?>" >> $FNAME
done
хотя мне нравится твой find
однострочник :)
$FNAME
должно быть $fname
- по соглашению мы используем заглавные переменные среды (PAGER, EDITOR, SHELL, ...) и переменные внутренней оболочки (BASH_VERSION, RANDOM, ...). Все остальные имена переменных должны содержать хотя бы одну строчную букву. Это соглашение позволяет избежать случайного переопределения внешних и внутренних переменных.