Запись в файл в определенном месте

Я пытаюсь создать сценарий, который добавит пользователя в список UserDir enabled userdir.conf или удалит его из списка UserDir disabled userdir.conf в userdir.conf .

Ради моего вопроса, допустим, у меня есть следующий файл:

 Lorem ipsum Lorem ipsum List 1 enabled Lorem ipsum Lorem ipsum List 2 disabled Lorem ipsum 

Я хотел бы сделать это, когда я запускаю свой скрипт со следующим ./script enabled user , чтобы изменить файл:

 Lorem ipsum Lorem ipsum List 1 enabled user Lorem ipsum Lorem ipsum List 2 disabled Lorem ipsum 

Впоследствии, если я это сделаю ./script disabled user он удалит пользователя из списка 1 и добавит его в два списка 2. Таким образом, выход файла будет:

 Lorem ipsum Lorem ipsum List 1 enabled Lorem ipsum Lorem ipsum List 2 disabled user Lorem ipsum 

Мой вопрос заключается не в том, как писать этот скрипт, а о том, как добавлять / удалять текст в / из файла в определенном месте .

Вопрос вне темы: есть ли лучший способ добавить / удалить пользователей в списке UserDir apache2?

2 Solutions collect form web for “Запись в файл в определенном месте”

Это можно сделать с помощью sed или awk . Выбирайте. Лично мне нравится использовать инструмент с минимальным размером. Разумеется, вы можете делать это на любом языке программирования, таком как машинный код Perl, C, SNOBOL или PDP-8, но это может быть настолько немного за пределами вопроса. 😉

Чтобы удалить пользователя из строки UserDir enable с помощью sed:

 sed -e '/^[^#]*UserDir\s\+enabled\s\+/ s/\bfoo\b//g' -e 's/\s\+/ /g' FILE-IN >FILE-OUT 

Это делает две вещи:

  1. Для всех строк, начинающихся с UserDir enabled без UserDir enabled , он удаляет пользователя foo (но не, например, пользователь foobar ).
  2. Он удаляет лишнее пустое пространство.

Чтобы добавить пользователя:

 sed -e '/^[^#]*UserDir\s+enabled\s+/ s/\(\s\+#\|$\)/ bar\1/' FILE-IN >FILE-OUT 

Это будет искать все строки, такие как Userdir enabled которые не закомментированы, как и раньше. Для любых найденных строк он добавит пользовательскую bar в конец. Если строка заканчивается комментарием, комментарий соблюдается и остается там.

Чтобы добавить новую UserDir enabled линию UserDir disabled после UserDir disabled линии UserDir disabled :

 sed -e '/^[^#]*UserDir\s+enabled\s+/ a UserDir disabled foo bar baz' FILE-IN >FILE-OUT 

Это использует команду append ( a ) sed для добавления текста после каждой строки без комментария, например UserDir enabled ... . Измените a на i чтобы вставить перед совпадающей строкой.

Некоторые примечания:

  • Очевидно, изменить «включено» на «отключено» по желанию.
  • Мы используем \s+ вместо пробелов для поиска случаев, когда используются другие формы пробелов (например, вкладки) и / или несколько символов пробела.
  • Вы можете объединить обе операции. Sed может запускать несколько выражений для каждого файла. Каждое выражение предоставляется после опции -e и выполняется в порядке слева направо.
  • Обратите внимание, что некоторые символы, которые не экранированы на некоторых диалектах регулярных выражений , сбрасываются для регулярного выражения, используемого sed .
  • Для хранения отредактированного файла ( FILE-IN ) потребуется временный файл ( FILE-OUT ). Если вы хотите вызвать их на месте (без перенаправления во временный файл), замените FILE-IN >FILE-OUT на -i FILE .
  • Это работает в Linux. Ваш пробег может варьироваться в зависимости от версий sed от других Unices. Вы можете найти -i (выше) недоступно и что поддержка регулярных выражений является более ограниченной.

Ответ на вне темы: было бы намного проще, если бы Apache разрешил вам вводить несколько директив UserDir и добавлял списки пользователей. Он может это сделать, но беглый чек подошел. Мне никогда не приходилось это делать, поэтому я не уверен, что это возможно.

Такие задачи проще решить, повторно создавая файл из источника (ов). Это похоже на предварительную обработку, и это более эффективно для создания результата из источников, а не для исправления результирующего файла.

  • Удалить файлы старше X дней +
  • Как определить, какой процесс создает файл?
  • Сравните две даты изменения файла
  • Извлекать записи из файла в диапазоне от одной даты к другой
  • Как конвертировать GBK в UTF-8 в каталог смешанных кодировок?
  • Запретить пользователю удалять папки и файлы в собственном доме
  • Добавить человекообразную метку времени последнего редактирования в имя файла
  • Невозможно создать файл + r
  • Что означает изменение файла / каталога?
  • Как перемещаться по селекторам файлов и каталогов диалогового окна?
  • Мониторинг доступа к каталогу на машине Linux
  • Interesting Posts

    Что означает «на входе» и «на выходе» означает в таких вариантах, как ICRNL и OCRNL?

    Пожалуйста, порекомендуйте клиента telnet GUI

    Как лучше всего отслеживать приключения начинающего администратора

    Отобразить физический путь USB-устройства к номеру шины / устройства, возвращенному lsusb

    Сравните два cdroms

    Как вы обрабатываете всю команду как sudo, которая включает перенаправление или конвейер?

    Избегание обычного текстового пароля в http_proxy

    Используйте системную команду вместо встроенного Bash без указания полного пути

    Найти шаблон в XML с помощью команды unix

    Пользовательское заполнение bash с каталогами и фиксированным набором

    Установка протокола gphotofs для установки Android-устройства в режиме PTP

    Автоматический ввод пароля ssh в сценариях оболочки в Linux

    Статус последнего выхода из скрипта без источника

    Как удалить привилегии root в сценариях оболочки?

    scdaemon / gpg не работает

    Linux и Unix - лучшая ОС в мире.