sed inplace replacement 替换自身

sed inplace replacement replaces itself

我有一个文件 shell 脚本(BusyBox,我相信没有 bash,ksh),我想在 运行 时为它自己写一个路径。我需要将#home 替换为 home=/home。我有这个:

var="/home"
#home
sed -i 's/#home/home=$var/g' /this/file.sh

当 运行 时,它将替换 #home 和 sed 行中的字符串并且不扩展 $var:

var="/home"
home=$var
sed -i 's/home=$var/home=$var/g' /this/file.sh

这是我想要的结果:

var="/home"
home=/home
sed -i 's/#home/home=$var/g' /this/file.sh

我正在努力让这个工作。有什么提示吗?

回答自己这按预期工作:

var="/home"
#home
sed -i "s|^#home|home=${var}/|g" m.sh

虽然可能有多种方法可以解决这个问题。尝试在模式的开头添加抑扬符 (^) 以指示应在行的开头找到此模式。

在运行脚本之前(此处命名为m.sh)

#!/bin/bash

var="/home"
#home
sed -i 's/^#home/home=$var/g' m.sh

在 运行 脚本之后

#!/bin/bash

var="/home"
home=$var
sed -i 's/^#home/home=$var/g' m.sh

编辑 您可能还想考虑删除 sed 中的 g 修饰符,因为您只想在行中匹配一次。