Замена перенаправления ошибок на нулевое устройство в скрипте Bash и создание нового файла - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь создать новый сценарий отладочной установки из существующего.Оригинальный скрипт установки содержит много операторов с перенаправлением >/dev/null 2>&1.Он включает в себя различные шаблоны, поэтому я нашел выражение регулярного выражения, которое соответствует всем:

>{1,2}\s{0,1}\/dev\/null 2>\&1

Я проверял это регулярное выражение здесь .

СейчасЯ хотел бы использовать этот шаблон для поиска и замены всех совпадений на пустые, чтобы в случае каких-либо ошибок выходной поток был перенаправлен на терминал, а не на устройство null.Моя попытка:

sed 's+>{1,2}\s\/dev\/null 2>\&1++g' install.sh > install_debug.sh

(я использовал + вместо / в качестве разделителя, чтобы сделать строку более читабельной)

Но когда я grep выходного файла или простоПередав результат без создания файла, /dev/null показывает, что подстановка не удалась:

sed 's/>{1,2}\s\/dev\/null 2>\&1//g' install.sh | grep "null"
  elif type lsb_release >/dev/null 2>&1; then
    if lsof /var/lib/dpkg/lock >> /dev/null 2>&1; then
      sudo apt-get update > /dev/null 2>&1 && \
      sudo DEBIAN_FRONTEND=falseninteractive apt-get install -y sshpass python-minimal python-pip dbus > /dev/null 2>&1 && \
      sudo apt-get install -y jq > /dev/null 2>&1
      sudo python_for_core_os > /dev/null 2>&1

Есть идеи, что я делаю не так?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 20 сентября 2019

У вас есть \s в попытке сопоставить 1 или более между > и /dev, но у строк может быть больше или их нет.Кроме того, вы не избегаете скобок в шаблоне POSIX BRE, поэтому sed 's/a{1,2}//' эффективно удаляет первый текст a{1,2}, а не один или два a с.Либо используйте POSIX ERE (с параметром -E), чтобы использовать a{1,2}, либо не используйте скобки (т. Е. sed -E 's/a{1,2}//' = sed 's/a\{1,2\}//').

Кроме того, & в шаблоне регулярных выражений имеет видне особенный, он только особенный в замене.Таким образом, нет необходимости избегать его здесь.Кроме того, поскольку вы использовали + в качестве разделителя, больше нет смысла экранировать / символов, замените \/ на /.

Используйте

sed 's+>\{1,2\}[[:space:]]*/dev/null[[:space:]]*2>&1++g' install.sh > install_debug.sh

InGNU sed, вы наверняка можете использовать \s для сокращения шаблона:

sed -E 's+>{1,2}\s*/dev/null\s*2>&1++g' install.sh > install_debug.sh

См. online sed demo

2 голосов
/ 20 сентября 2019

Вам нужно сбежать от {:

$ sed 's#>\{1,2\}\s*/dev/null\s*2>\&1##g' install.txt
  elif type lsb_release ; then
    if lsof /var/lib/dpkg/lock ; then
      sudo apt-get update  && \
      sudo DEBIAN_FRONTEND=falseninteractive apt-get install -y sshpass python-minimal python-pip dbus  && \
      sudo apt-get install -y jq 
      sudo python_for_core_os 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...