如何用sed替换含斜杠的systemd服务配置行内容?
修改systemd服务脚本的sed命令解决方案
需求说明
现有如下systemd服务脚本:
[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行替换为:
ExecStart=-/sbin/agetty 9600 %I $TERM
原命令问题
尝试的sed命令因搜索字符串包含斜杠/,而sed默认以/作为分隔符,导致命令解析失败:
sed -i 's/ExecStart=-/sbin/agetty -o '-p -- \u' --keep-baud 110200,38900,9680 %I $TERM/ExecStart=-/sbin/agetty 9600 %I $TERM/g'
解决方法
方法1:更换sed分隔符
选择字符串中未出现的字符(如#)作为分隔符,避免与/冲突,同时正确转义单引号和反斜杠:
sed -i 's#ExecStart=-/sbin/agetty -o '\''-p -- \\u'\'' --keep-baud 115200,38400,9600 %I $TERM#ExecStart=-/sbin/agetty 9600 %I $TERM#g' /path/to/your/service/file.service
- 用
#替代默认的/作为分隔符 - 原字符串中的单引号
'需转义为'\''(在单引号包裹的sed命令中,通过'结束当前单引号段,用\'转义单引号,再用'重新开启单引号段) - 原字符串中的
\u需转义为\\u,避免被sed解析为特殊字符
方法2:转义搜索字符串中的斜杠
如果坚持使用/作为分隔符,需将所有/转义为\/,同时处理单引号和$符号:
sed -i "s/ExecStart=-\/sbin\/agetty -o '-p -- \\u' --keep-baud 115200,38400,9600 %I \$TERM/ExecStart=-\/sbin\/agetty 9600 %I \$TERM/g" /path/to/your/service/file.service
- 用双引号包裹sed命令,便于转义
$TERM中的$为\$ - 所有
/转义为\/
内容的提问来源于stack exchange,提问作者Zaks
相关产品推荐
相关产品推荐

