2016-09-27 108 views
0

我正在使用macOS Sierra,并且正在尝试操作配置文件中的某个键的值。使用sed替换自定义字符串替代命令'/'坏标志

为了实现我使用(这对于简单值正常工作):

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

不幸的是,我的字符串$值与许多特殊字符相当复杂,给我的错误:

bad flag in substitute command: '/'

我的$值被声明为:

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>' 

因为我有双重曲otes是$ VALUE的价值的一部分,我不能使用双引号而不是单引号时声明它...任何想法解决这个问题?

回答

0

的问题是,$VALUE包含需要转义,因为它与分离的substiture命令

,因为如果它的变化,你必须再次逃脱他们不方便冲突斜线。不过,这是一个解决方案。

另一个更简单的解决方案是使用一个替代的分离对于s命令,它是不是在$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 
+0

工程就像一个魅力,反正我会建议使用不同的正则表达式,如:“S | \($ KEY [[:空间:]] * * = * \)。* | \ 1'$ VALUE'|“ – fcarvalho