sed:使用通配符替换字符串时出现问题

sed:使用通配符替换字符串时出现问题

我正在尝试使用以下命令替换字符串:

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/"替换hostnamehostname=int1.

相比之下,正则表达式hostname=.*意味着hostname=后跟零个或多个任何字符。这就是为什么s/\<hostname=.*\>/hostname=int1/替换hostname=abchostname=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

相关内容