Я искал и нашел хорошо информированные ответы, которые, как мне кажется, должны работать, но я не могу заставить их работать. Проблема в том, что я явно не понимаю 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