Добавление строки текста в несколько файлов

Итак, у меня есть куча файлов в каталоге, и мне нужно вставить строку текста в каждую из них. Они имеют, по существу, следующий формат:

<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, возможно, сопоставив и заменив этот тег. Я собираюсь начать делать это сейчас, но если у кого-то есть существующий способ сделать это, я бы хотел это услышать.

  • Присвоить результат sed переменной
  • Сопоставление и удаление строк с ~ 100 строк
  • Как использовать хэш (#) в качестве разделителя для sed
  • Живая замена, при просмотре журнала с использованием LESS
  • Как сгруппировать группу строк на основе информации из первой строки?
  • Sed: поиск и замена паттенов специальными символами, которые имеют произвольную строку между
  • sed, разделяя переменную (предоставляющую число) из инструкции для вставки текста по определенной строке
  • Удалите все новые строки в текстовом файле, используя sed
  • 4 Solutions collect form web for “Добавление строки текста в несколько файлов”

    Что-то вроде этого:

     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 

    Если вы не возражаете против попытки Perl:

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

    Переключатель -i сохранит ваш старый файл с расширением .old и напечатает его до текущего.

    Вы также можете использовать «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 

    Такой подход дает вам преимущества «ex»: поиск местоположения с шаблонами elaboarte и «движения курсора». Вы можете делать такие вещи, как найти шаблон, а затем найти следующий экземпляр, ТОГДА сделайте вставку. Или вы можете менять текст, а не просто делать вставки. Или вы можете переключаться между диапазонами. Не забывайте, что «ex» позволяет использовать «.». как текущая строка, так., / ^ somepatter / s / blah / foo / будет работать.

    Вы можете использовать следующий код отдельной строки, чтобы вставить одну строку или несколько строк в заданное место в файле, в вашем случае перед «VirtualHost». Код в основном ищет имя файла (это может быть *. *, Если вы хотите вставить тексты во все файлы) в пределах данного каталога и его подкаталогов. В найденных файлах он ищет шаблон «VirtualHost». После того, как он нашел шаблон, он заменяет его первой строкой \ nsecondline \ notherlines \ n \ VirtualHost. Обратите внимание, что «VirtualHost» является частью текста для замены, иначе мы потеряем его.

     find directory/ -name filename -print | xargs sed -i 's|VirtualHost|firstline\nsecondline\notherlines\nVirtualHost|g' 
    Linux и Unix - лучшая ОС в мире.