Как заменить строку выводом команды?

Я получил эту ошибку, когда использовал несвободную версию дистрибутива Debian. Бесплатная версия работала нормально и без проблем. Я считаю, что проблема в том, что руководство по установке не может загрузить часть кодовой базы и, следовательно, не может выполнять функции раздела из-за отсутствия кода. Например, глядя на команды busybox, нет команд mountили ls.

-2
27.09.2021, 13:03
4 ответа

Если вы используете GNU sed, вы можете использовать флаг /eдля команды s/, но выполняемой командой будет вся строка:

#!/bin/sed -f
/my_server_ip/{
s//%s/
s/.*/printf '&' $(hostname -i)/e
}

Это создает командную строку, которая выглядит как printf '"server":"%s",' $(hostname -i), а затем выполняет ее, заменяя соответствующую строку.

0
27.09.2021, 13:17

Вы можете использовать параметр замены, например: sed -i -e "s/my_server_ip/$(hostname -i)/" txt

1
27.09.2021, 13:43

Я предполагаю, что вы просто хотите изменить то, что находится в кавычках после "server", а не конкретную строку my_server_ip, и если это так, то используйте любой sed:

$ sed 's/\("server":"\)[^"]*/\1'"$(hostname -i)"'/' file
"server":"<the host name>",
"server_port":8388,

или любой другой awk (более надежный, если вывод hostname -iможет содержать метасимволы обратной ссылки или разделители sed, чего не должно быть):

$ awk -v h="$(hostname -i)" 'BEGIN{FS=OFS="\""} $2=="server"{$4=h} 1' file
"server":"<the host name>",
"server_port":8388,
4
27.09.2021, 14:07
m=$(hostname -i)
sed -i "s/my_server_ip/$m/g" filename
"server":"192.168.1.1",
"server_port":8388,
0
28.09.2021, 19:12

Теги

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