脚本如下所示
[Unit]
Description=Serial Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Type=idle
Restart=always
UtmpIdentifier=%I
ExecStart=-/sbin/agetty -o '-p -- \\u' --keep-baud 115200,38400,9600 %I $TERM
想要更换
ExecStart=-/sbin/agetty -o '-p -- \\u' --keep-baud 115200,38400,9600 %I $TERM
with
ExecStart=-/sbin/agetty 9600 %I $TERM
尝试过这些命令
sed -i 's/ExecStart=-/sbin/agetty -o '-p -- \\u' --keep-baud 110200,38900,9680 %I $TERM/ExecStart=-/sbin/agetty 9600 %I $TERM/g'
但由于搜索字符串中存在 / ,它不起作用
有人可以帮忙吗
使用 sed 替换具有 / 的行内容
[...]
由于搜索字符串中存在 / ,它无法工作
这是它不起作用的一个原因。您的示例还存在与目标文本中嵌入引号相关的问题。
对于
/
字符,有几种可能性。满足一般情况的最简单的方法是使用不同的字符作为模式分隔符。 /
是最常用的,但您可以选择任何字符。 ,
、|
和 #
是相当常见的替代品。例如:
sed -i "s#ExecStart=-/sbin/agetty -o '-p -- \\\\u' --keep-baud 110200,38900,9680 %I \$TERM#ExecStart=-/sbin/agetty 9600 %I \$TERM#g" myunit.service
但这有点严厉。您的输入只有一行
ExecStart
行,因此足以识别要编辑的行,并且您无需替换整行 行。我可能会使用这样的东西:
sed -i '/ExecStart/ s/agetty.*/agetty 9600 %I $TERM/' myunit.service
也就是说:在匹配模式
/ExecStart
的每一行上,将以字符串 agetty
替换以 agetty 9600 %I $TERM
开头的最长子字符串。 (注意:我删除了 g
选项,因为它没有实际意义:模式无论如何都不能匹配多次。)当然,这是为您的特定示例精心设计的,但类似的可以用于许多其他情况。