使用 SED 将当前变量的一部分替换为用户输入变量

使用 SED 将当前变量的一部分替换为用户输入变量

我试图用新的用户输入变量仅替换部分现有变量,如下所示:

#Current Variable:
gdbName=Test.MY.DOMAIN.COM <--I need to replace the "Test" (This can be any other string not just Test e.g. CDB79 etc.) part only in this variable with new user input variable. 

#New user input variable:
read -p "Enter CDB Name : "  CDBName

#I tried the following line:
sed -i "s/gdbName=*.MY.DOMAIN.COM/gdbName=$CDBName/" somefile.txt

但它取代了整个变量。

有什么建议么?

注意:我正在更新文件中的变量。

答案1

假设你想修改一个文件,其中有一些行,

gdbName=Test.MY.DOMAIN.COM

那么这可以使用来完成

sed "s/^\(gdbName\)=Test\./\1=$CDBName./" somefile

或者,如果您需要更通用并且不指定字符串Test,则可以匹配任何不包含点的字符串(包括空字符串):

sed "s/^\(gdbName\)=[^.]*\./\1=$CDBName./" somefile

这些命令将行的开头(直到第一个点)替换为变量名称(字符串gdbName)、等号和 shell 变量 的值CDBName

假定用户输入CDBName不包含&/或 的任何特殊的反斜杠编码字符序列sed

无论哪种情况,shell 脚本都不需要定义任何名为 的变量gdbName

您的尝试删除了域名的尾部部分,因为您明确要求sed匹配并替换它。

答案2

例如,要通过变量动态设置新名称(此处仅显示永久更改):

接近你的尝试:

sed -i "s/gdbName=*.MY.DOMAIN.COM/gdbName=$CDBName/" somefile.txt

sed -i "s/gdbName=.*\.MY\.DOMAIN\.COM/gdbName=$CDBName.MY.DOMAIN.COM/" somefile.txt

请注意,正则表达式中的点匹配任何字符,但包括点本身,因此在大多数情况下,此处屏蔽点有点过头了。

相关内容