Как я могу использовать ‘sed’ в файле сценария Linux Bash для закомментирования определенной строки с интервалом между табуляциями?

#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. Спасибо за ответ! Не удалось заставить это работать:/ Регулярное выражение в моем приведенном выше выражении осталось от предыдущей команды, которую я использовал, и оставлено на всякий случай. Еще раз спасибо, что помогли мне!