Информация, подробно описанная в последнем обновлении вопроса, дала мне представление о том, в чем заключается проблема.
У меня было включено dhcpcd.service
для всех интерфейсов. Я попытался отключить его и включить только для enp10s0
, и это сработало.
Так:
systemctl disable dhcpcd
systemctl enable dhcpcd@enp10s0
и вуаля.
Здесь есть две проблемы. Во-первых, ваша команда sed
заключена в одинарные кавычки (''
), поэтому переменная не раскрывается:
$ echo $ruledeck
/praj/test/drc_tsn/test1
$ echo '$ruledeck'
$ruledeck
Я вижу, вы заключили переменную в двойные кавычки внутри команды sed
, но это ничего не изменит, так как все это заключено в одинарные кавычки. Вместо этого вам нужно заключить его в двойные кавычки:
sed -e "3s/$/$ruledeck/" file
Однако и это сломается:
$ sed -e "3s/$/$ruledeck/" file
sed: -e expression #1, char 8: unknown option to `s'
Это потому, что ваша переменная содержит /
, но вы также используете /
в качестве разделителя для оператора подстановки(s///
). Вам нужен другой разделитель. Это должно делать то, что вы хотите:
$ sed -e "3s|$|$ruledeck|" file
#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck"/praj/test/drc_tsn/test1
action $a set_parameter "options"
Но это все равно не совсем правильно, если в конце строки нет пробела. Чтобы также добавить пробел, но только если его еще нет, используйте\?
(пробел и экранированный вопросительный знак ), чтобы соответствовать «0 или 1 пробелу». Все это вместе дает:
$ sed -e "3s| \?$| $ruledeck|" file
#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck" /praj/test/drc_tsn/test1
action $a set_parameter "options"
Вы можете избежать проблем с кавычками и разделителями регулярных выражений, используя ed
, чтобы добавить строку после строки 3, а затем соединить строку 3 и новую строку 4. например.
printf "%s\n" 3a " $ruledeck". 3,4j wq | ed -s DRC.txt
printf "%s\n"
используется для передачи каждого из оставшихся аргументов текстовому -редактору ed
, по одному.
ex
или vi -e
(, или vim -e
, илиvim -E
)можно использовать вместо ed
-, но обратите внимание, что ex
и различные реализации vi
вставляют пробел при соединении строк,в то время как ed
не соответствует (, поэтому пробел в начале строки в кавычках " $ruledeck"
не требуется с этими ). Все они, наряду с sed
и другими родственными программами, реализуют одни и те же основные команды редактирования, с некоторыми в основном -незначительными отличиями, которые появились в qed в 1965 году. Некоторые также реализуют значительные расширения этих команд..