#linux #bash #shell #ubuntu #sed
#linux #bash #оболочка #ubuntu #sed
Вопрос:
Я хочу добавить ‘#’ в начало этой строки в определенном файле, используя sed. Скрипт будет запущен в файле .sh, а не введен в консоль.
auth [success=1 default=ignore] pam_unix.so nullok_secure
Должно быть:
#auth [success=1 default=ignore] pam_unix.so nullok_secure
В настоящее время я пытаюсь выполнить команды, подобные:
sudo sed -e '/auth[[:tab:]][success=1[[:space:]]default=ignore][[:tab:]]pam_unix.so[[:space:]]nullok_secure/ s/^#*/#/' -i /etc/pam.d/common-auth
Я знаю, что приведенная выше команда неверна, поскольку [[:tab:]]
это недопустимая команда. Я просто хочу показать, где находятся вкладки.
Любая помощь приветствуется!!! Спасибо!!!
Ответ №1:
В Ubuntu вы можете использовать t
for tab, и я полагаю, что это даже указано в POSIX.
/autht[success=1 default=ignore]tpam_unix.so nullok_secure/
Я думаю, что у меня возникли проблемы с этим на BSD, но если вам все равно, что это именно вкладка, и вы приняли бы строку, даже если в ней есть другие типы пробелов, вы могли бы быть немного более гибкими
/auth[[:space:]] [success=1 default=ignore]pam_unix.so[[:space:]]nullok_secure/
какой GNU-изм для
обозначения одного или нескольких предыдущих, чтобы быть более ПОЗИТИВНЫМ, вы могли бы это сделать
/auth[[:space:]][[:space:]]*[success=1 default=ignore]pam_unix.so[[:space:]]nullok_secure/
(И обратите внимание, что [:space:]
класс character содержит не только символ пробела, это набор пробелов, который включает символы табуляции.)
Также обратите внимание, что мы должны экранировать [
шаблон, который вы сопоставляете, или он определит класс символов для сопоставления, что, безусловно, не то, что вы пытаетесь здесь.
В качестве другого варианта, предполагая, что ваша common-auth
строка похожа на мою, это единственная строка, которая есть success=1
в ней, поэтому вы можете просто использовать ее, хотя она более хрупкая, если другие люди некоторое время вносят изменения в файл.
Комментарии:
1. Это тоже работает! Большое спасибо! Я пытался
t
раньше, но я ошибался в нескольких других вещах. Еще раз спасибо!
Ответ №2:
Это работает…
sed -e '/^autht[success=1 default=ignore]tpam_unix.so nullok_secure/ s/^/#/' -i file
Я просто использую t
вместо [[:tab:]]
И
вместо [[:space:]]
Комментарии:
1. «Linux» очень широк, поэтому это может сработать на некоторых Linuxes и не сработать на других. Какая
sed
это версия?
Ответ №3:
Вы делаете это очень сложно для себя. Файлы authconfig являются стандартными и не нуждаются во всех используемых вами регулярных выражениях.
sed -i 's/^auth [success=1 default=ignore] pam_unix.so nullok_secure/#auth [success=1 default=ignore] pam_unix.so nullok_secure/' /etc/pam.d/common-auth
Если вы действительно хотите быть конкретным, я бы не стал использовать поиск пробелов и табуляций. Просто найдите нужный текст и пробел между ними.
Комментарии:
1. Согласно комментариям в другом ответе,
[
символ является метасимволом регулярного выражения, и его необходимо экранировать. Возможно, вам также следует описать, как использовать литеральные вкладки (легко, если вы пишете скрипт в редакторе, требует секретного соуса ctrl-V во многих интерактивных оболочках).2. Кроме того, повторять текст подстановки дословно довольно сложно. Сценарий OP в этом отношении лучше; или вы могли бы просто использовать
amp;
в замене, чтобы вернуться ко всему сопоставленному тексту.3. Спасибо за ответ! Не удалось заставить это работать:/ Регулярное выражение в моем приведенном выше выражении осталось от предыдущей команды, которую я использовал, и оставлено на всякий случай. Еще раз спасибо, что помогли мне!