Bash 在替换命令中获取坏标志'/';使用sed替换自定义字符串

Bash 在替换命令中获取坏标志'/';使用sed替换自定义字符串,bash,sed,escaping,special-characters,double-quotes,Bash,Sed,Escaping,Special Characters,Double Quotes,我正在使用macOS Sierra,我正在尝试从配置文件中操作一个键的值 为了实现这一点,我使用了(对于简单的值来说,这很好): 不幸的是,我的字符串$VALUE非常复杂,包含许多特殊字符,这给了我一个错误: 替换命令中的错误标志:'/' 我的美元价值声明为: VALUE='<Request xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" ReturnPolicyIdList="false" CombinedDecision="

我正在使用macOS Sierra,我正在尝试从配置文件中操作一个键的值

为了实现这一点,我使用了(对于简单的值来说,这很好):

不幸的是,我的字符串$VALUE非常复杂,包含许多特殊字符,这给了我一个错误:

替换命令中的错误标志:'/'

我的美元价值声明为:

VALUE='<Request xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" ReturnPolicyIdList="false" CombinedDecision="false"> <Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"> <Attribute IncludeInResult="false" AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id"> <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">test </AttributeValue> </Attribute> </Attributes> <Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"> <Attribute IncludeInResult="false" AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"> <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">testing something</AttributeValue> </Attribute> </Attributes> </Request>'
VALUE='testtesting something'

由于双引号是$value值的一部分,所以在声明它时不能使用双引号而不是单引号。。。有什么办法解决这个问题吗?

问题是,
$VALUE
包含斜杠,应该转义斜杠,因为它与substiture命令的分隔符冲突

这并不方便,因为如果它改变了,你必须再次逃避它们。不过,这是一个解决办法

另一个更简单的解决方案是为s命令使用另一个分隔字符,该字符不在
$VALUE
字符串中,例如
%
%
不太可能在这样的字符串中,否则也可以使用

或使用管道:

sed -i .bak "/^$KEY/s|\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)|\1\2$VALUE|" $CONFIG_FILE

工作起来很有魅力,不管怎样,我建议使用不同的正则表达式,例如:“s |($KEY[[:space:][]**).*1'$VALUE'|”
sed -i .bak "/^$KEY/s%\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)%\1\2$VALUE%" $CONFIG_FILE
sed -i .bak "/^$KEY/s|\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)|\1\2$VALUE|" $CONFIG_FILE