使用 sed 替换具有 / 的行内容

问题描述 投票:0回答:1

脚本如下所示

[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' 

但由于搜索字符串中存在 / ,它不起作用

有人可以帮忙吗

linux string bash shell sed
1个回答
0
投票

使用 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
选项,因为它没有实际意义:模式无论如何都不能匹配多次。)当然,这是为您的特定示例精心设计的,但类似的可以用于许多其他情况。

© www.soinside.com 2019 - 2024. All rights reserved.