#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’), это возможная альтернатива, если запрос вызван слишком длинной строкой для записи в командной строке, а не в скрипте.