Назад | Перейти на главную страницу

sed для замены некомментированных строк в файле

Я искал и нашел хорошо информированные ответы, которые, как мне кажется, должны работать, но я не могу заставить их работать. Проблема в том, что я явно не понимаю sed и все косые черты и что все это связано с регулярным выражением. Думаю, именно поэтому я не могу перейти мост из-за очень информативных ответов (например, sed: -e выражение неизвестная опция для `s '), чтобы сделать эту работу для меня.

/ и т.д. / сеть / интерфейс:

# WAN (Internet connection)
auto wlp3s0 
iface wlp3s0 inet dhcp
dns-nameservers 1.1.1.1 8.8.8.8 
wpa-conf /etc/wpa_supplicant_some1.conf
#wpa-conf /etc/wpa_supplicant_oldstuff.conf

сценарий bash:

#!/bin/bash
NEW_LINE="wp-conf /etc/wpa_supplicant_someother.conf"
sed -i '/wpa-conf /c\'"$NEW_LINE" /etc/network/interfaces

Вышеуказанный вид работ. Вся строка в файле, начинающаяся с wpa-conf, заменяется новой строкой в ​​скрипте, что прекрасно.

Но есть неприятный нюанс: изменена и закомментированная строка wpa-conf. Это то, чего я пытаюсь избежать. Читая другие ответы, я пробовал их в сценарии и кучу других безнадежных вариантов, которые, как мне казалось, безрезультатно. Это приводит к различным ошибкам:

sed -i '/^#/!s/wpa-conf /c\'"$NEW_LINE" /etc/network/interfaces
sed -i '|^#|!s|wpa-conf /c\'"$NEW_LINE" /etc/network/interfaces
sed -i '|^#|!s|wpa-conf |c\'"$NEW_LINE" /etc/network/interfaces

Я явно не знаю, что делаю, и, очевидно, не могу понять, как работает sed, а другие ответы только усугубили ситуацию.

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

С уважением и благодарностью

Я бы посмотрел первый ответ на эта запись. Если вы хотите заменить только строки, начинающиеся с 'wpa-conf', вам следует добавить ^ и это должно делать то, что вы хотите.

sed -i '/^wpa-conf /c\'"$NEW_LINE" /etc/network/interfaces