我正在尝试使用以下命令替换字符串:
sed -e "s/\<$5\>/$6/g" "$2/$1" > "$4/$3"
$5-> "hostname=*"
$6-> "hostname=int1"
$2/$1-> "source file path"
$4/$3-> "destination file path"
当我尝试替换以下内容时:
hostname=abc
我明白了,
hostname=int1=abc
但我想要,
hostname=int1
我如何匹配字符串来实现这一目标?
答案1
sed
使用正则表达式。这些与 shell 使用的模式(“glob”)不同。
请注意,以下内容不起作用:
$ echo hostname=abc | sed "s/\<hostname=*\>/hostname=int1/"
hostname=int1=abc
但是,以下内容确实如此:
$ echo hostname=abc | sed "s/\<hostname=.*\>/hostname=int1/"
hostname=int1
你需要.
在 之前有一个*
.
作为正则表达式,hostname=*
表示hostname
后跟零个或多个等号。因此sed "s/\<hostname=*\>/hostname=int1/"
替换hostname
为hostname=int1
.
相比之下,正则表达式hostname=.*
意味着hostname=
后跟零个或多个任何字符。这就是为什么s/\<hostname=.*\>/hostname=int1/
替换hostname=abc
为hostname=int1
.
答案2
可能有比这更好的解决方案,但您可以使用以下命令。
sed /hostname.*$/s//"hostname=int1"/g /home/path/of/your/original/file > /tmp/hello.$$
cat /tmp/hello.$$ > /home/path/of/your/original/file