2014-01-07 23 views
1

我仍然试图学习sed所以请原谅我,如果这是一个简单的问题。使用sed我不能得到以下工作

我有一个XML文件,如下

<configs> 
<config name="{subdomain}" protocol="rdp"> 
    <param name="hostname" value="{windows IP}" /> 
    <param name="port" value="3389" /> 
    <param name="username" value="{windows user to log in as}" /> 
    <param name="password" value="{windows password}" /> 
</config> 
</configs> 

我试图让添加和移除的配置部分。对于追加我有以下

sed 's/.*[/]configs.*/<config name=\"'$SUBDOMAIN'\" protocol=\"'$TYPE'\">\n<param name="hostname" value=\"$HOSTNAME\">\n<param name="port" value=\"'$PORT'\" >\n<param name="username" value="" >\n<param name="password" value="{windows password}" >\n</config>\n&/' 

这个工作,直到我加入'</config>'线。在那之后,它声明's'声明没有关闭,任何人都可以帮我理解这个语法吗?

编辑 - 我试图通过转义斜杠<\/config>使用下面的建议之一,但我仍然有同样的问题。

sed 's/.*[/]configs.*/ 
<config name=\"'$SUBDOMAIN'\" protocol=\"'$TYPE'\">\n 
<param name="hostname" value=\"$HOSTNAME\">\n 
<param name="port" value=\"'$PORT'\" >\n 
<param name="username" value="" >\n 
<param name="password" value="{windows password}" >\n 
<\/config>/n&/' guacd/noauth-config.xml 

的sed:-e表达式#1,焦炭17:未结束的'S'命令

这适用于以下

sed 's|.*[/]configs.*|<config name=\"'$SUBDOMAIN'\" protocol=\"'$TYPE'\">\n<param name="hostname" value=\"$HOSTNAME\">\n<param name="port" value=\"'$PORT'\" >\n<param name="username" value="" >\n<param name="password" value="{windows password}" >\n</config>\n&|' guacd/noauth-config.xml 
+0

可能重复“未终止的“命令”故障排除](http://stackoverflow.com/questions/4070478/sed-error-unterminated-s-command-troubleshooting) – tripleee

+2

我不重复这个问题。虽然问题是相关的。我相信这里的问题仅仅是替代品的''部分中没有引号的'/'。改为尝试'<\/config>'。 –

+1

请记住,'sed'不是编辑XML的好工具。除非您对XML所需的换行符做出假设,否则'sed'代码会变得非常混乱。最好使用提供正确的XML解析器的语言(Python,Perl等)。 – chepner

回答

0

你已经在你的行话,它关闭了'$SUBDOMAIN'第一个定义脚本的单引号。尝试从脚本中删除单引号。

+1

我使用单引号退出并获取变量。 – user3170001

1

/</config>关闭您的sed。看看这个简化的例子:

$ date | sed -e 's/./</config>/' 
sed: 1: "s/./</config>/\n": bad flag in substitute command: 'c' 

不起作用。 sed认为第二个/(在</config>)是该命令的结尾,试图将以下config作为标志(如s///gi中的gi),但没有c标志,因此它会窒息。

您可以逃脱/这样的:

$ date | sed -e 's/./<\/config>/' 
</config>ue Jan 7 19:59:19 CET 2014 

或者使用的,而不是/这样一个不同的分隔符:

$ date | sed -e 's|.|</config>|' 
</config>ue Jan 7 20:01:30 CET 2014 
[sed的错误
+0

感谢您的建议,但使用转义工作并不如尝试不同的分隔符,导致相同的错误。 – user3170001

+0

'$ SUBDOMAIN','$ PORT'和'$ TYPE'的值究竟是什么?你能否举个例子说脚本不行? – janos