Як я можу додати тег до початку кількох файлів?


Відповіді:


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

(Це -iдля редагування на місці.)

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

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

nifty - це трохи простіше, ніж те, що я збирався описати :)
warren

Мені тут потрібно додати розширення до аргументу -i. Ви використовуєте sed або GNU sed?

Річард: Я використовую претензії на GNU sed, і це дозволяє додавати резервний суфікс.
користувач1686

2
Я використовую BSD sed, і це дозволяє редагувати місце, але мені потрібно надати розширення. тобто "sed -i .bak" PATTERN "файл"

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

5

Ви можете використовувати такий AWKфільтр,

awk '{if (NR == 1) printf "% s% s", "PREFIX", $ 0; else print $ 0} 'testfile> newfile

Де PREFIXваш рядок префікса php.


5

Я поки не можу залишити коментар, але зробити все це за один крок:

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

Любіть це, врятували мені години.
Стів Хілл

5

Ви можете зробити це за допомогою одного вкладиша 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}, перевірити, чи всі файли оновлено правильно, а потім видалити всі файли з цим розширенням.


1
"Значення 0777 призведе до того, що Perl буде цілувати файли цілими, оскільки немає юридичного байта з цим значенням", див. Sial.org/howto/perl/one-liner/#s3.5
Chris W. Rea

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

Альтернатива тому, що ви написали, додавши щось до кінця кожного файлу в каталозі (in bash):

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

хоча мені подобається ваш findоднолінійний :)


$FNAMEповинно бути $fname- за умовою, ми використовуємо великі величини середовища (PAGER, EDITOR, SHELL, ...) та внутрішні змінні оболонки (BASH_VERSION, RANDOM, ...). Усі інші назви змінних повинні містити принаймні одну малу літеру. Ця конвенція дозволяє уникнути випадкових переваг екологічних та внутрішніх змінних.
Кріс Даун

@Chris Down - конвенція, яку я бачив, всю свою кар'єру змінилася, встановивши: малі, великі регістри та верблюди :)
warren

Верблюд і малі регістри чудово. Так чи інакше, змінні, що не є змінними середовища, не повинні бути повністю великими.
Кріс Даун

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.