Как вставить путь в конце строки номер 3

Информация, подробно описанная в последнем обновлении вопроса, дала мне представление о том, в чем заключается проблема.

У меня было включено dhcpcd.serviceдля всех интерфейсов. Я попытался отключить его и включить только для enp10s0, и это сработало.

Так:

systemctl disable dhcpcd
systemctl enable dhcpcd@enp10s0

и вуаля.

1
22.08.2019, 15:21
2 ответа

Здесь есть две проблемы. Во-первых, ваша команда 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"
3
27.01.2020, 23:17

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

1
27.01.2020, 23:17

Теги

Похожие вопросы