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

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

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

  • сплит 60GB плоский файл с записями, иногда охватывающих несколько строк
  • Возобновление прерванного процесса копирования
  • идентифицировать недостающие файлы в папке
  • Объединение пар файлов в цикле
  • Как ACL вычисляет эффективные разрешения для файла?
  • suid-root не влияет
  • как объединить разные файлы, имеющие один и тот же заголовок, но немного другое имя файла?
  • поиск каталогов, содержащих один файл, и отсутствие другого
  • член группы не может записать файл с возможностью записи в группу с помощью reiserfs и расширенных списков ACL
  • Что имеет приоритет - разрешение владельца / пользователя и группы?
  • Как я могу сказать, когда файл был сжат?
  • Linux и Unix - лучшая ОС в мире.