Мені потрібно додати теги 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:
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для цієї мети, покажіть це у своїй відповіді.
Альтернатива тому, що ви написали, додавши щось до кінця кожного файлу в каталозі (in bash):
for FNAME in *
do
echo "?>" >> $FNAME
done
хоча мені подобається ваш findоднолінійний :)
$FNAMEповинно бути $fname- за умовою, ми використовуємо великі величини середовища (PAGER, EDITOR, SHELL, ...) та внутрішні змінні оболонки (BASH_VERSION, RANDOM, ...). Усі інші назви змінних повинні містити принаймні одну малу літеру. Ця конвенція дозволяє уникнути випадкових переваг екологічних та внутрішніх змінних.