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

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

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

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' 
  • Как удалить все между двумя символами с помощью sed?
  • Как только выводить строки, которые моложе 3 месяцев?
  • Как записывать данные по одному из файлов tmp в конечный выходной файл, используя для цикла?
  • заменить строку в цикле
  • Распечатайте последнее поле
  • Удаление следующего-последнего расширения в имени файла
  • Использование sed для преобразования строк в строки
  • Удалить строку перед пробелом
  • Разделить файл на основе требуемой строки
  • Linux + захватывает только IP из команды mount
  • Используя sed с herestring (<<<) и прочитайте -a
  • Замена части строки числами обратного отсчета с помощью команды sed
  • Linux и Unix - лучшая ОС в мире.