如何修复sed无效的命令代码'?

时间:2014-08-28 03:55:03

标签: linux macos bash shell sed

我有一个包含以下2个命令的shell脚本:

sedcmd1="sed -i '' '/<PromptOnUpdate>true<\/PromptOnUpdate>/G' /Users/abc/data.xml"
$sedcmd1

当我运行脚本时,我得到以下错误:

sed: 1: "'/<PromptOnUpdate ...": invalid command code '

如果我运行命令而不将其分配给变量,它运行就好了。但是只有当我将它分配给变量并从那里执行它时才会出错。

我需要变量中的命令以满足我的需要,因为我尝试接收命令作为shell脚本的参数。

data.xml的片段:

<?xml version="1.0" ?>
<Settings Version="1.0.0">
    <Android>
       <PromptOnUpdate>true</PromptOnUpdate>
    </Android>
</Settings>

感谢您对此进行调查!

PS:我在Mac OSX Mavericks上

2 个答案:

答案 0 :(得分:4)

扩展变量后不会处理引号。您需要使用eval

eval "$sedcmd1"

答案 1 :(得分:1)

shell在扩展变量之前处理引号。这意味着变量中的引号没有魔力;他们被视为与任何其他角色一样。

要将复杂命令存储为变量,您需要一个数组:

sedcmd1=(sed -i '' '/<PromptOnUpdate>true<\/PromptOnUpdate>/G' data.xml)

可以执行数组:

${sedcmd1[@]}

如果您不确定是否定义了数组字符,可以使用declare命令始终查看其中的内容;

declare -p sedcmd1

产生:

declare -a sedcmd1='([0]="sed" [1]="-i" [2]="" [3]="/<PromptOnUpdate>true<\\/PromptOnUpdate>/G" [4]="data.xml")'