Можно ли разбить длинную команду sed на несколько строк?

#linux #bash #command-line #sed

#linux #bash #командная строка #sed

Вопрос:

У меня есть sed команда, которая очень длинная

 sed -i 's/append ro initrd=initrd.img quiet splash nbdport=2000/append ro initrd=initrd.img quiet splash nbdport=2000 video=LVDS-1:d/g' /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default
  

Можно ли разбить ее на несколько строк, чтобы было более понятно, что она делает?

Например, что-то вроде?

 sed -i 's/
append ro initrd=initrd.img quiet splash nbdport=2000
/
append ro initrd=initrd.img quiet splash nbdport=2000 video=LVDS-1:d
/g'
/var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default
  

Ответ №1:

 sed 's/[long1][long2]/[long3][long4]/' file.txt
  

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

 sed 's'/
'[long1]'
'[long2]'
'/'
'[long3]'
'[long4]'
'/' file.txt
  

Ответ №2:

Есть пара способов уменьшить это. Если вы просто добавляете текст в конец строки, вы можете использовать sed следующим образом:

 sed -i '/append ro initrd=initrd.img quiet splash nbdport=2000/s/$/ video=LVDS-1:d' ...
  

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

 PXE_BOOT_FILE=/var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default
SEARCH_PATTERN='append ro initrd=initrd.img quiet splash nbdport=2000'
REPLACE_PATTERN="$SEARCH_PATTERN video=LVDS-1:d"
sed -i "s/$SEARCH_PATTERN/$REPLACE_PATTERN/g" "$PXE_BOOT_FILE"
  

Комментарии:

1. Что означает s / $ / после ввода? Можете ли вы объяснить немного больше?

2. @Jitamaro: s/$/xxx/ это способ добавления xxx в конец строки. В регулярном выражении $ соответствует концу строки. Вы также можете сделать s/^/xxx/ добавление xxx к началу строки.

3. @hitamaro: заменить. Это будет применяться только к строкам, которые соответствуют предыдущему регулярному выражению. Вы также можете использовать номера строк и диапазоны. Прочитайте адреса sed (раздел «Адреса») на странице руководства sed для получения более подробной информации.

Ответ №3:

Да, можно, просто процитируйте ее как обычно:

 sed 's/foo/bar/g
     s/baz/quux/g'
  

Комментарии:

1. Ну, не совсем. Фактически, вы должны использовать точку с запятой ; для разделения команд, если они находятся в одной строке. Если команды находятся в разных строках, то нет необходимости в ; (но это не повредит, если она там есть).

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

3. это сокращение из двух действий, и запрос собирается сократить одно s / / / действие.

Ответ №4:

Это может сработать для вас:

 sed -i 's/append ro initrd=initrd.img quiet splash nbdport=2000/amp; video=LVDS-1:d/g' /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default
  

или

 string="append ro initrd=initrd.img quiet splash nbdport=2000"
sed -i 's/'"$string"'/amp; video=LVDS-1:d/g' /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default
  

Примечание: amp; в правой части замены представляет все совпадающие регулярные выражения в левой части

Ответ №5:

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

 sed -i 's/nbdport=2000/nbdport=2000 video=LVDS-1:d/g' /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default
  

Ответ №6:

Сандра, ты можешь альтернативно поместить эту большую команду sed в файл, скажем, tftp.sed и вызвать sed, например, sed -i -f tftp.sed /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default где tftp.sed файл выглядит как:

 # my very long line:
s/append ro initrd=initrd.img quiet splash nbdport=2000/append ro initrd=initrd.img quiet splash nbdport=2000 video=LVDS-1:d/g
# note: every sed command in this file must be in a separate line
  

Как вы можете видеть выше, внутри исходного файла sed может быть несколько команд sed, просто убедитесь, что каждая из них находится в отдельной строке.

Комментарии:

1. даже если она не воспроизводится в соответствии с запросом (прерывание длинного действия sed ‘single’), это возможная альтернатива, если запрос вызван слишком длинной строкой для записи в командной строке, а не в скрипте.