sed: -e выражение # 1, char 44: регулярное выражение с неопределенным адресом

ПРОБЛЕМА:

Я пишу скрипт для настройки установок Debian ….. Мне нужно закомментировать строку в sources.list для DVD, я пытаюсь использовать sed, я знаю, как удалить строку или строки, но хочу вместо этого закомментировать.

Что у меня есть это:

sed -i '/deb cdrom:[Debian GNU/Linux 9.4.0 _S/s/^/#/' /etc/apt/sources.list 

но это дает эту ошибку:

 sed: -e expression #1, char 44: unterminated address regex 

Я предполагаю, что проблема заключается в кронштейне.

ВОПРОС:

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

Попробуй это,

  sed -i '/deb cdrom:\[Debian GNU\/Linux 9\.4\.0 _S/s/^/#/' /etc/apt/sources.list 
  • нам нужно избежать [ , / и . в шаблоне поиска, / потому что это разделитель, и [ и . потому что они являются операторами регулярных выражений.

Поскольку строка поиска является константой, а наличие метасимволов регулярных выражений является раздражителем, вы также можете сделать это следующим образом:

  awk -i inplace 'index($0, "deb cdrom:[Debian GNU/Linux 9.4.0 _S"){$0 = "#" $0}1' /etc/apt/sources.list 

Вам повезло, если у вас есть доступ к GNU awk 4.1.0 или выше для эффекта редактирования на месте. OTW, вы можете сделать с Perl :

 perl -pi -e 's/^/#/ if index($_, "deb cdrom:[Debian GNU/Linux 9.4.0 _S") + 1' /etc/apt/sources.list