Как использовать регулярное выражение в sed?

Мне нужно отменить sudo доступ к пользователю, используя sed в скриптах.
Я хочу прокомментировать пользователя, только если строка содержит / bin / su – root
Давайте рассмотрим файл, как показано ниже, в котором я должен прокомментировать только первую строку.

mindadmin ALL = NOPASSWD: /bin/su - root mindadmin ALL = NOPASSWD: /bin/ifconfig 

Я использовал команды sed как sed ниже:

 sed -e 's/minadmin[\s]+ALL[\s]+=[\s]+NOPASSWD:[\s]+/bin/su - root/#mindadmin ALL = NOPASSWD: /bin/su - root/g' /etc/sudoers 

Но это не работает. Есть ли в нем синтаксическая ошибка?

  • как я могу подавить unedsary вывод seds при использовании опции -e?
  • Строки из двух разных массивов не совпадают?
  • Сценарий манипулирования открытыми ключами SSH в файле authorized_keys
  • Перенаправить скрипт stderr и stdout в файл, но сохранить stdout в tty?
  • Как удалить новую строку перед EOF в файле text / csv через bash
  • Получить нагрузку на процессор ядра в сценарии оболочки
  • Могу ли я написать вывод команды разницы времени в файл?
  • Перепишите команду find, которая использует sed -i для AIX
  • 4 Solutions collect form web for “Как использовать регулярное выражение в sed?”

    Есть две проблемы: во-первых, ваши mindadmin имеют mindadmin и ваш шаблон minadmin (без d ).

    Вторая проблема заключается в / s из /bin/su , вам нужно избегать их внутри регулярного выражения:

     sed -e 's/mindadmin[\s]+ALL[\s]+=[\s]+NOPASSWD:[\s]+\/bin\/su - root/#mindadmin ALL = NOPASSWD: \/bin\/su - root/g' /etc/sudoers 

    в противном случае они заканчивают шаблон.

    Вы также можете использовать другой разделитель вместо / , если это не происходит в файле, вам не нужно его избегать.

      sed '/\/bin\/su - root/ s/^/#/' filename 

    Он находит строки в имени файла, содержащем /bin/su - root , и добавляет комментарий (#) в начале строки (^).

    Добавьте параметр -i в sed для выполнения файла.

    Если вы хотите прокомментировать все строки, содержащие /bin/su - root в конце строки, вы можете упростить выражение sed:

     sed 's/.*\/bin\/su - root$/#&/' 

    Или, еще проще

     sed 's,.*/bin/su - root$,#&,' 

    Чтобы прокомментировать все строки, содержащие /bin/su - root любой точке строки:

     sed 's,.*/bin/su - root,#&,' 

    Поскольку & заменяется на весь шаблон соответствия, здесь другое решение:

     sed -i 's,.*/bin/su\s\+-\s+root,#&,' /etc/sudoers 

    / заменяется другим разделителем, поэтому вам не нужно его избегать. Шаблон также более гибкий, если интервал после команды su отличается.

    Если он должен только изменить пользователя min d admin:

     sed -i 's,^mindadmin\s.*/bin/su\s+-\+root,#&,' /etc/sudoers 

    Флаг -i непосредственно применяет изменения к файлу.

    Interesting Posts

    При каждом обновлении Firefox сбрасывает все настройки браузера по умолчанию. Зачем?

    Когда будут dpkg удалять каталоги?

    Как часто вызывается fsync в повседневном использовании?

    Туннелирование через несколько компьютеров в Red Hat с различными пользователями и ключами

    Вывести визуальное (ASCII) дерево зависимостей Debian на терминал?

    Сервер Openssh: фатальный: слишком много сокетов для прослушивания. Увеличить MAX_LISTEN_SOCKS

    Создание сочетаний элементов из вектора для ввода в качестве входных данных в программе

    Функция Bash с аргументами

    суммы столбцов на основе совпадающих полей

    Когда dd подходит для копирования данных? (или, когда read () и write () частично)

    Перезаписать часть файла без модификации в немодифицированный контент

    Как заставить dpkg управлять python3.6?

    Как «человек» восстанавливает экран при выходе из программы?

    Создание пользователя, который не может получить интерактивную оболочку

    Как вы скрываете панель?

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