【问题标题】:using sed i cannot get the following to work使用 sed 我无法使以下工作
【发布时间】:2014-01-08 17:56:27
【问题描述】:

我还在努力学习 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&/'

这一直有效,直到我添加了 '&lt;/config&gt;' 行。之后它说明's'语句没有关闭,任何人都可以帮我解决这个问题的语法吗?

编辑 - 我尝试通过使用正斜杠 &lt;\/config&gt; 转义来使用以下建议之一,但仍然遇到同样的问题。

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 expression #1, char 17: unterminated `s' command

这适用于以下内容

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

【问题讨论】:

  • 我不会重复这个问题。虽然问题是相关的。我相信这里的问题只是替换的&lt;/config&gt; 部分中未引用的/。请改用&lt;\/config&gt;。
  • 请记住,sed 不是编辑 XML 的好工具。除非您对 XML 所需的换行符做出假设,否则 sed 代码会变得非常混乱。最好使用提供适当 XML 解析器的语言(Python、Perl 等)。

标签: linux bash sed awk grep


【解决方案1】:

&lt;/config&gt; 中的 / 关闭您的 sed。看看这个简化的例子:

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

不起作用。 sed 认为第二个/(在&lt;/config&gt; 中)是命令的结尾,尝试将以下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

【讨论】:

  • 感谢您的建议,但使用转义符并没有像尝试不同的分隔符一样有效,会导致相同的错误。
  • $SUBDOMAIN、$PORT 和 $TYPE 的值究竟是什么?你能举出脚本不起作用的例子吗?
【解决方案2】:

您的模式中有'$SUBDOMAIN',它关闭了定义脚本的第一个单引号。尝试从脚本中删除单引号。

【讨论】:

  • 我使用单引号退出并抓取变量。
猜你喜欢
  • 2020-05-30
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多