使用Ubuntu中的sed替换带有特殊字符值的字符串

时间:2018-05-02 10:44:50

标签: shell ubuntu sed

以下是xml文件,其中STORAGE_ACCOUNT_KEY应替换为EoKpaH0W / kqTv9awgIpQX5s + qQwGzXUSxMxhRjfSWG7SIUTWhut1OYQkNxhb3 / 9UKGf + g4tc3UaC0zKMTSrTNg ==

   <property>
      <name>fs.azure.account.key.storageaccountname.blob.core.windows.net</name>
      <value>STORAGE_ACCOUNT_KEY</value>
   </property>

我尝试了以下内容。但没有什么可以帮助我解决它。

  1. 使用/之后和之前的
  2.   

    sed -i“s / STORAGE_ACCOUNT_KEY / EoKpaH0W / kqTv9awgIpQX5s + qQwGzXUSxMxhRjfSWG7SIUTWhut1OYQkNxhb3 / 9UKGf + g4tc3UaC0zKMTSrTNg == / g”test.xml

    错误: -

    sed: -e expression #1, char 32: unknown option to `s'
    
    1. 使用|在s之后和之前
    2. sed -i "s|STORAGE_ACCOUNT_KEY/EoKpaH0W/kqTv9awgIpQX5s+qQwGzXUSxMxhRjfSWG7SIUTWhut1OYQkNxhb3/9UKGf+g4tc3UaC0zKMTSrTNg==|g" test.xml
      

      错误: -

      sed: -e expression #1, char 112: unterminated `s' command
      

      注意: - $ STORAGE_ACCOUNT_KEY是一个动态变量,如下所示

      sed -i "s|STORAGE_ACCOUNT_KEY/$STORAGE_ACCOUNT_KEY|g"
      

1 个答案:

答案 0 :(得分:1)

要替换XML,我会使用XML解析器(例如sed)而不是sed

那就是说,你的sed表达是错误的。

s s命令使用3个分隔符(您想要的任何可打印字符),但这3个必须是相同的,并且由{{>后面的那个定义。 1}}命令。

s/foo/bar/g   # right
s|foo|bar|g   # right
s|foo/bar|g   # wrong

由于您使用base64字符串替换字符串,因此不应使用任何base64字符,因此在这种情况下请勿使用/作为sed分隔符。

你的表达应该是这样的:

sed -i "s|STORAGE_ACCOUNT_KEY|EoKpaH0W/kqTv9awgIpQX5s+qQwGzXUSxMxhRjfSWG7SIUTWhut1OYQkNxhb3/9UKGf+g4tc3UaC0zKMTSrTNg==|g" test.xml

请注意,如果每行只有1个要替换的字符串,则可能不需要命令末尾的g修饰符。