Додавання рядка тексту до кількох файлів


10

Отже, у мене є маса файлів у каталозі, і мені потрібно вставити рядок тексту у кожну з них. Вони по суті мають такий формат:


<VirtualHost *:80>
        ServerAdmin gabe@localhost
        DocumentRoot /var/www/test1
        ServerName test1.local
        ServerAlias test1
        <Directory "/var/www/test1">
                Options All
                AllowOverride All
        </Directory>
</VirtualHost>

І я хотів би вставити рядок перед закриттям

</VirtualHost>
тег. Моє перше припущення, що я повинен бути в змозі зробити це за допомогою sed, ймовірно, відповідності та заміни цього тега. Я зараз почну намагатися це зробити, але якщо у когось є такий спосіб зробити це, я хотів би це почути.


Я буду чесно кажучи, коли кажу, що думаю, що це більше завдання програмування ... і, таким чином, я повинен бути на ЗО. Я б використовував Perl для цього, особливо, оскільки я думаю, що існує модуль Perl, призначений для розбору та зміни конфігурацій apache.
ксенотерацид

2
Дякую, але це завдання, яке повинно бути легко виконати за допомогою простих інструментів Unix, тому тут і запитують. Дякую за ваш коментар.
габе.

Відповіді:


10

Щось на зразок цього:

sed 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/'

працює. Якщо ви хочете повторити цю команду в багатьох файлах, ви можете зробити щось на кшталт:

for i in *; do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' "$i"; done

Можливо, краще (але не перевірено) завдяки @ChrisDown:

find . -type f -print0 | while IFS= read -r -d '' filename;\
do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' $filename;\ 
done

дивовижно ... це саме те, що я шукав.
габе.

1
Ви НЕ розібрати Ls. Замість цього використовуйте глобус. mywiki.wooledge.org/ParsingLs
Chris Down

Ви rigth @ChrisDown. Будь ласка, вдосконаліть мою відповідь.
lcipriani

Вибір іншого символу, ніж /для виразу sed, більш чіткий, оскільки вам не доведеться уникати косої риси:'s:</VirtualHost>:yourlinehere\n</VirtualHost>:'
Олександр

2

Якщо ви не заперечуєте проти Perl, спробуйте:

perl -pi'*.old' -e 's(</VirtualHost>(Your stuff here\n</VirtualHost>)' myfile

-iКомутатор буде зберегти старий файл з .oldрозширенням і печаткою на поточний.


2

Ви також можете використовувати "ex" (командний рядок vi), якщо редагування, яке ви хочете зробити, є навіть дещо складним. Наприклад, ви хочете вставити лише один екземпляр "".

Такий сценарій оболонки може працювати:

for FILENAME in *.whatever  # Need a criteria to glob, or a list of names
do
    ex -s $FILENAME << END_EDITS
/^<\/VirtualHost>/
O " capital-o, not zero
text to insert goes here
.
w!
q
END_EDITS
done

Такий підхід дає вам переваги "колишнього": пошук місця з виразними візерунками та "переміщення курсору". Ви можете робити такі речі, як знайти шаблон, а потім знайти наступний екземпляр, ТОГО зробіть вставку. Або ви можете змінити текст, а не просто робити вставки. Або ви можете змінювати між діапазонами. Не забувайте, що "колишній" дозволяє використовувати ". як поточний рядок, так., / ^ somepatter / s / blah / foo / буде працювати.


0

Ви можете використовувати наступний код рядка для вставки одного рядка або декількох рядків у задане місце у файлі, у вашому випадку перед "VirtualHost". Код, в основному, шукає ім'я файлу (це може бути *. *, Якщо ви хочете вставити тексти у всі файли) всередині даного каталогу та його підкаталогів. У файлах, знайдених, він шукає шаблон "VirtualHost". Після того, як він знайшов шаблон, він замінює його на перший рядок \ nsecondline \ notherlines \ n \ VirtualHost. Зауважте, що "VirtualHost" є частиною тексту для заміни, інакше ми втратимо його.

find directory/ -name filename -print | xargs sed -i 's|VirtualHost|firstline\nsecondline\notherlines\nVirtualHost|g'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.