我试图用新的用户输入变量仅替换部分现有变量,如下所示:
#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
请注意,正则表达式中的点匹配任何字符,但包括点本身,因此在大多数情况下,此处屏蔽点有点过头了。